Какие действия предпринимает операционная система по отношению к процессу со свёрнутым главным окном?
Вопрос безотносительно какой-либо конкретной операционной системы и языка программирования.
Работая на Windows 11, я обнаружил, что свёрнутое приложение начинает замедляться. Отладка привела меня к потоку, который периодически засыпает на заданный интервал времени. Не будем рассуждать о том, что усыпление потока - антипаттерн, факт в том, что именно здесь я обнаружил, что при свёрнутом главном окне фактическое время сна потока становится больше, чем при развёрнутом. Вот код, демонстрирующий проблему:
from PySide6.QtWidgets import QMainWindow, QApplication
from PySide6.QtCore import QThread, Slot
import sys
from collections import deque
from datetime import datetime, timedelta
import numpy as np
import matplotlib.pyplot as plt
class worker(QThread):
def __init__(self, parent=None):
super().__init__(parent)
self.wake_time = deque(maxlen=200)
self.wake_time_diff = []
@Slot()
def run(self):
while not self.isInterruptionRequested():
QThread.msleep(10)
self.wake_time.append(datetime.today())
diff = self.time_diff()
self.wake_time_diff.append(diff)
print(diff)
def time_diff(self):
a = list(self.wake_time)[:-1]
b = list(self.wake_time)[1:]
diff = [b - a for a, b in zip(a, b)]
diff = [a / timedelta(microseconds=1) for a in diff]
if len(diff) == 0:
return None
else:
return sum(diff) / len(diff)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.w = worker()
self.w.start()
def closeEvent(self, event):
self.w.requestInterruption()
self.w.quit()
self.w.wait()
time_diff = np.array(self.w.wake_time_diff)
fig = plt.figure()
ax = fig.add_subplot()
ax.plot(time_diff)
fig.savefig('1.png')
plt.close(fig)
return super().closeEvent(event)
if __name__ == '__main__':
app = QApplication()
mw = MainWindow()
mw.show()
sys.exit(app.exec())
На выходе получается график:
На моменте ~2000 окно было свёрнуто, ~3600 - развёрнуто. Ясно видно, что в свёрнутом состоянии время сна становится больше.
Я понимаю, что так задумано, понимаю, зачем это сделано, и что вряд ли можно это исправить (хотя не пробовал менять приоритет процесса). Но если есть какие-то иные воздействия операционной системы на такой процесс, то я хотел бы об этом знать.
Мой вопрос в том, где найти информацию о том, как та или иная операционная система поступает с процессами, главное окно которых свёрнуто (или потеряло фокус), а также при отключённом политикой энергосбережения экране.