Как мне отложить выполнение кода в Visual Basic (VB6)?
Вопрос
У меня есть долго выполняющийся процесс в VB6, который я хочу завершить перед выполнением следующей строки кода.Как я могу это сделать?Встроенная функция?Могу ли я контролировать, как долго ждать?
Тривиальный пример:
Call ExternalLongRunningProcess
Call DoOtherStuff
Как мне отложить "допрос"?
Решение
VB.Net:Я бы использовал Подождите дескриптор события.
VB 6.0:Я видел цикл DoEvents.
Do
If isSomeCheckCondition() Then Exit Do
DoEvents
Loop
Наконец-то ты мог просто поспать:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sleep 10000
Другие советы
В то время как у Нецио ответ (DoEvents) будет работать, это приведет к тому, что ваше приложение будет использовать 100% одного процессора.Режим сна сделает пользовательский интерфейс невосприимчивым.Что вам нужно, так это сочетание этих двух факторов, и волшебная комбинация, которая, кажется, работает лучше всего, это:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
While IsStillWaitingForSomething()
DoEvents
DoEvents
Sleep(55)
Wend
Почему два события выполняются, а одно переходит в режим ожидания на 55 миллисекунд?Время ожидания в 55 миллисекунд - это наименьший фрагмент, который может обработать VB6, и иногда требуется использование двух DoEvents в случаях, когда требуется сверхответственность (не API, но если ваше приложение реагирует на внешние события, SendMessage, прерывания и т.д.).
Разбейте ваш код на 2 процесса.Запустите первый, затем запустите свой "долго выполняющийся процесс", затем запустите второй процесс.
Запустите свой длительный процесс в середине текущего процесса и дождитесь его завершения.
Я бы хотел, чтобы вы могли просто добавить .net framework system.dll или что-то еще в ссылки на свои проекты, чтобы вы могли просто сделать это:
Dim ALongTime As Integer = 2000
System.Threading.Thread.Sleep(ALongTime)
...каждый раз.У меня есть VB6 и VB.net 2008 на моей машине, и мне всегда сложно переключаться между очень разными IDE.
System.Threading.Thread.Sleep(500)