pywinauto - это Python модуль для автоматизации процессов над графическим интерфейсом Microsoft Windows. Другими словамия, модуль позволяет эмулировать действия мыши и клавиатуры над объектами окна.
Порой случается такая ситуация что приложение выполняет какое либо трудоемкое задание, при этом не выдает никаких "внешних" признаков по которым можно было бы отследить средствами pywinauto факт завершения выполнения задачи. Использование простой задержки time.sleep() черевато проблемами, если таймаут наступит, а процесс все еще будет занят.
Все что мы знаем в такой ситуации это то что процесс потребляет ресурсы CPU, так почему бы этим не воспользоваться?
Напишем вспомогательную функцию которая бы отслеживала CPU активность процесса и уведомяла нас когда он завершит выполнение трудоемкой задачи, проще говоря, перестанет грузить проц.
Для того что бы узнать текущую нагрузку CPU приложением воспользуемся библиотекой psutil. Привиденный ниже код следит за уровнем загрузки процессора приложением и если он в течении time_sec секунд находится ниже отметки threshold то считается что приложение выполнило свою трудоемкую задачу и теперь можно выполнять код дальше. В случае если программа явно ушла в бесконечный цикл и не освободает ресуры ЦПУ, то через заданный промежуток времени timeout функция вернет значение False.
import time
import psutil
def WaitUntilCPULoadRelease(process_id, time_sec=3, threshold=2.5, timeout=300):
psutil_process=psutil.Process(process_id)
start_time=time.time()
mark_time=None
while True:
if psutil_process.cpu_percent()<threshold:
mark_time=mark_time or time.time()
if (time.time()-mark_time)>=time_sec:
return True
else:
mark_time=None
if (time.time()-start_time)>=timeout:
return False
time.sleep(0.1)
Эта функция вообще будет работать?
ОтветитьУдалитьСначала вы его делаете bool-значением этой строчкой
>>mark_time=mark_time or time.time()
А потом это же значение вычитаете из числа:
>>time.time()-mark_time
может что-то непонимаю, но кажется Вы где-то очепятолись
Вы что то не понимаете. А именно что делает логический оператор or. Читайте в книге Лутца например
ОтветитьУдалитьФункция рабочая