Как мне отложить выполнение кода в Visual Basic (VB6)?

У меня есть длительный процесс в VB6, который я хочу завершить перед выполнением следующей строки кода. Как я могу это сделать? Встроенная функция? Могу ли я контролировать, как долго ждать?

Банальный пример:

Call ExternalLongRunningProcess
Call DoOtherStuff

Как мне отложить DoOtherStuff?


person Ray    schedule 18.09.2008    source источник
comment
Вы можете подробнее рассказать? Это внешний процесс, и если да, то как вы его называете?   -  person Ben Hoffstein    schedule 18.09.2008


Ответы (8)


VB.Net: я бы использовал дескриптор события WaitOne.

VB 6.0: Я видел цикл DoEvents.

Do
     If isSomeCheckCondition() Then Exit Do
     DoEvents
Loop

Наконец-то можно было просто поспать:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sleep 10000
person Nescio    schedule 18.09.2008
comment
DoEvents - это то, что вы использовали бы для возврата управления графическому интерфейсу во время длительных процессов. - person Sean Gough; 18.09.2008

Хотя ответ (DoEvents) будет работать, это заставит ваше приложение использовать 100% одного процессора. В спящем режиме пользовательский интерфейс не отвечает. Что вам нужно, так это их комбинация, и волшебная комбинация, которая, кажется, работает лучше всего:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

While IsStillWaitingForSomething()
    DoEvents
    DoEvents
    Sleep(55)
Wend

Почему два события DoEvents и один спящий режим на 55 миллисекунд? Сон в 55 миллисекунд - это наименьший фрагмент, который может обработать VB6, и использование двух DoEvents иногда требуется в случаях, когда требуется сверхчувствительность (не API, но если ваше приложение реагирует на внешние события, SendMessage, Interupts и т. Д. ).

person Kris Erickson    schedule 19.09.2008
comment
Я голосую за то, что вы напомнили мне, как я счастлив, что мне больше не нужно заниматься VB6 :-) - person Matt; 21.09.2008
comment
Я голосую за вас за то, что вы предоставили именно то, чем этот сайт выделяется. Легко найти, уместные и точные советы. @Matt, я бы тоже был рад не использовать VB6, но моему клиенту он нужен, поэтому я собираюсь сделать шаг вперед. И благодаря Крис мне не пришлось целый час суетиться, пытаясь вспомнить точное сочетание «делаю события» и сна, которое я забыл 10 лет назад. Спасибо, Крис, это сработало отлично! - person William; 11.10.2011

Как определить, когда закрытый процесс завершился:

Если вы вызываете внешний процесс, вы, по сути, вызываете его асинхронно. Обратитесь к вышеупомянутому документу поддержки MS, чтобы узнать, как дождаться завершения внешнего процесса.

person Sean Gough    schedule 18.09.2008

Разбейте свой код на 2 процесса. Запустите первый, затем запустите свой «длительный процесс», затем запустите второй процесс.

person EndangeredMassa    schedule 18.09.2008

Запустите длительный процесс в середине текущего процесса и дождитесь его завершения.

person EndangeredMassa    schedule 18.09.2008

Я бы хотел, чтобы вы просто добавили .net framework system.dll или что-то еще в свои ссылки на проект, чтобы вы могли просто сделать это:

Dim ALongTime As Integer = 2000
System.Threading.Thread.Sleep(ALongTime)

...каждый раз. У меня на машине есть VB6 и VB.net 2008, и мне всегда сложно переключаться между очень разными IDE.

person RetroDev    schedule 04.07.2017

Если вы хотите написать sleep или wait без объявления sleep, вы можете написать цикл, использующий системный таймер. Это то, что я использую для тестирования / отладки при запуске интерпретатора. Это можно добавить, когда интерпретатор приостановлен, если вам понадобится такая вещь:

Dim TimeStart as currency
Dim TimeStop as currency
Dim TimePassed as currency
Dim TimeWait as currency

'use this block where you need a pause
TimeWait = 0.5 'seconds
TimeStart = Timer()
TimePassed = 0
Do while TimePassed < TimeWait  'seconds
    TimeStop = timer()
    TimePassed = TimeStop - TimeStart 
    doevents
loop
person RkdL    schedule 08.04.2021

person    schedule
comment
Это VB.net, а не VB6 - person MarkJ; 09.11.2013