Ваш код не делает то, что вы говорите, он делает. Устанавливает приоритет для программы.
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
событии, которое меняет выбор, в конечном итоге завершится с нехваткой места в стеке.