Эквивалент Python для VB6 DoEvents - PullRequest
0 голосов
/ 14 января 2019

Существует ли Python-эквивалент оператора VB6 DoEvents, где обработчик будет временно передаваться ОС? Я нашел похожий код в http://code.activestate.com/recipes/496767-set-process-priority-in-windows/

def setpriority(pid=None,priority=1):
    """ Set The Priority of a Windows Process.  Priority is a value between 0-5 where
        2 is normal priority.  Default sets the priority of the current
        python process but can take any valid process ID. """

    import win32api,win32process,win32con

    priorityclasses = [win32process.IDLE_PRIORITY_CLASS,
                       win32process.BELOW_NORMAL_PRIORITY_CLASS,
                       win32process.NORMAL_PRIORITY_CLASS,
                       win32process.ABOVE_NORMAL_PRIORITY_CLASS,
                       win32process.HIGH_PRIORITY_CLASS,
                       win32process.REALTIME_PRIORITY_CLASS]
    if pid == None:
        pid = win32api.GetCurrentProcessId()
    handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, True, pid)
    win32process.SetPriorityClass(handle, priorityclasses[priority])

Есть ли лучший и более питонский способ?

1 Ответ

0 голосов
/ 15 января 2019

Ваш код не делает то, что вы говорите, он делает. Устанавливает приоритет для программы.

DoEvents - это внутренняя вещь VB, которая позволяет VB приостанавливать свой код и запускать другой код в вашей программе. Таким образом, это опасно, потому что события могут стать возвращающимися.

Часть о переключении на ОС выполняется в конце DoEvents, и она вызывает Windows API для вызова Sleep(0), что составляет 0 секунд ожидания, но оставшиеся оставшиеся 20 мс времени выдают другим процессам.

См. Документацию: https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-sleep

Подробнее о DoEvents.

В VBA / VB6 все функции / подпрограммы / свойства / методы выполняются от Sub до End Sub. Ни одна другая подфункция / функция не может работать, пока работает другая. DoEvents меняет это.

В далеком прошлом WordBasic и т. Д. Один использовал sendkeys для отправки нажатий клавиш в приложение, в котором вы работали (Word для Wordbasic). Но так как ваш макрос был запущен, Word не смог обновить его состояние. Один использовал DoEvents с SendKeys, чтобы автоматизировать слова, которые не были программируемыми, и обновлять свой интерфейс. В WordBasic не было событий.

Вы не можете изменять глобальные переменные, не можете использовать глобальные переменные, которые могут изменяться, вы не можете изменять входные параметры, и вы должны убедиться, что подпрограмма / функция с DoEvents не является повторно входящей ( или только ограниченное количество раз). Или плохие вещи случаются, и это не может быть предсказуемо. Например, вызов doevents в selectionchange событии, которое меняет выбор, в конечном итоге завершится с нехваткой места в стеке.

...