Частичное выполнение функции в течение определенного периода времени и сохранение прогрессаPython

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Частичное выполнение функции в течение определенного периода времени и сохранение прогресса

Сообщение Гость »


Я создал скрипт Python, который использует в основном две функции в цикле. Первая функция (clickFast()) должна быть точно рассчитана по времени и запускаться как можно чаще — она делает что-то очень простое и переходит в режим ожидания. Вторая функция (calculateFully()) интенсивно вычисляет некоторые данные для использования первой функцией.

Вторую функцию можно запускать только во время сна первой функции (чтобы первая функция выполнялась как можно быстрее). Теперь я хочу выполнить вторую функцию «частично», чтобы остановить ее, когда время сна закончится, и возобновить ее при следующем вызове сна. Я попытался создать третью функцию (calculatePartly(time)), но именно с этим мне нужна помощь.

Я подготовил пример сценария, чтобы проиллюстрировать эту проблему: Я хочу нажать на какую-то позицию на экране (первая функция). Позиция «вычисляется» второй функцией (на самом деле: путем создания скриншота и сопоставления шаблона с sample.jpg с использованием win32gui и cv2). Здесь я использовал несколько случайных значений и таймер для имитации этого поведения, потому что этот код довольно длинный. и неинтересно.

время импорта из win32api импортировать SetCursorPos, GetCursorPos, GetAsyncKeyState импортировать pydirectinput как pd импортировать случайный # Это данные, обработанные первой функцией screenClickPosition = Нет # Задержка клика clickDelay = 50/1000 # равно 50 миллисекундам # Запускайте это как можно чаще Защитный кликFast(): # Просто щелкните здесь; никаких больших расчетов если (screenClickPosition имеет значение «Нет»): возвращаться курсорОригинал = ПолучитьКурсорПос() SetCursorPos(screenClickPosition) # Спать между кликами # Пока я сплю, я хочу рассчитатьPartly() время сна и вернуться сюда #time.sleep(clickDelay) вычислитьЧастич(кликЗадержка) pd.keyDown("а") pd.keyUp("а") # Пока я сплю, я хочу рассчитатьPartly() время сна и вернуться сюда #time.sleep(clickDelay) вычислитьЧастич(кликЗадержка) SetCursorPos (курсорОригинал) защита вычислитьFully(): глобальный экранClickPosition screenClickPosition = findClickPositionOnScreen() # Рассчитывать screenClickPosition только для определенного времени Защиту вычислитьPartly (timeInMS): # ??? защита findClickPositionOnScreen(): # Этой функции требуется около 0,3–0,6 с, чтобы вернуть позицию щелчка, или нет, если sample.jpg не найден # Я использую win32gui для сопоставления снимка экрана и шаблона cv2, чтобы найти небольшой образец.jpg внутри моего экрана # Имитировать время расчета время.сон(0,5) # Имитация вывода (либо Нет, либо какая-то позиция курсора) расчетная позиция = нет если (bool(random.getrandbits(1))): вычисляемаяПозиция = ПолучитьКурсорПос() возврат рассчитанной позиции защита основной(): пока правда: if (GetAsyncKeyState(0x20)): # Я нажимаю пробел? # Здесь мы можем не торопиться, потому что пока не на что нажать... если (screenClickPosition имеет значение «Нет»): вычислитьПолно() # Вызовите это как можно чаще нажмитеБыстро() # Вход основной() Время клика должно быть максимально точным, в то время как позиция клика может «отставать». Чтобы внести ясность: даже если новая позиция щелчка обновляется только каждые 5 секунд, я хочу щелкнуть по этой (возможно, устаревшей) позиции много сотен раз, в зависимости от задержки щелчка (которая будет варьироваться от 0 мс до 1 секунды). Я хочу приостановить расчет положения щелчка, чтобы убедиться, что время щелчков правильное. Хотя расчет частично выполнен, (старый) screenClickPosition должен оставаться доступным для нажатия.

В настоящее время я использую 64-разрядную версию Python 3.11.5 в Windows 10. Я могу переписать любой код или использовать любые библиотеки. Однако мне нужно запустить его в Windows 10.

Моя идея реализации функции CalculPartly():

Я проверяю время, прошедшее между каждой командой, которую я использую для определения позиции (например: 1. сделать снимок экрана, 2. найти все файлы sample.jpg на скриншоте, 3. вычислить ближайший найденный файл sample.jpg к положению мыши. Все это шаги можно разбить на еще большее количество команд). Если пройдет достаточно времени, я сохраняю свой прогресс. При следующем вызове CalculPartly() я сначала проверяю ранее сохраненный прогресс, чтобы знать, с чего начать

calculatePartlyStoppedId = 0 ВычислитьЧастичныеДанные = Нет # Рассчитывать screenClickPosition только для определенного времени Защиту вычислитьPartly (timeInMS): глобальный расчетPartlyStoppedId глобальное вычислениеPartlyData start = time.time() # получаем текущую временную метку если (calculatePartlyStoppedId == 1): # начнём с cmd2 # ... # повторите здесь 1000 строк кода... # ... проходить элиф (calculatePartlyStoppedId == 2): # начнём с cmd3 # ... # повторите здесь 999 строк кода... # ... проходить #элиф... для каждого идентификатора # cmd1 время.сон(0.01) # Проверяем, прошло ли достаточно времени if (time.time() - start >= timeInMS): вычислитьPartlyStoppedId = 1 CalculatePartlyData = [] # поместите сюда все значения, полученные до этого момента возвращаться # cmd2 время.сон(0.01) # Проверяем, прошло ли достаточно времени if (time.time() - start >= timeInMS): вычислитьPartlyStoppedId = 2 CalculatePartlyData = [] # поместите сюда все значения, полученные до этого момента возвращаться # повторяем для каждой команды # ... Это ужасная идея, потому что, если мне нужно изменить 1 строку кода (в моих расчетах), мне придется изменить 100 строк (и я повторю код несколько сотен раз). В идеале у меня есть только одна функция Calculate() с своего рода «точками останова отладки», которые запоминают, где функция остановилась в последний раз.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»