我有一个需要长时间运行的VB6进程,在执行下一行代码之前,我想要它完成。我该如何做?是否有内置函数可以实现?我能控制等待的时间吗?
简单示例:
Call ExternalLongRunningProcess
Call DoOtherStuff
我该如何延迟执行 'DoOtherStuff'?
虽然 Nescio 的 回答(DoEvents)可以工作,但它会导致应用程序使用 100% 的一个 CPU。Sleep 会使 UI 失去响应。你需要的是两者的结合,而看起来最好的魔法组合是:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
While IsStillWaitingForSomething()
DoEvents
DoEvents
Sleep(55)
Wend
为什么要使用两个DoEvents以及一个休眠时间为55毫秒?55毫秒的休眠时间是VB6可以处理的最小时间片,有时候在需要超级响应能力的情况下(不是由API引起的,而是当应用程序需要响应外部事件、SendMessage、中断等),使用两个DoEvents是必要的。
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
sleep
的 sleep
或 wait
,你可以编写一个使用系统计时器的循环。这是我在运行解释器时进行测试/调试时使用的方法。如果需要,可以在解释器暂停时添加此内容。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
在当前进程中运行您的长时间运行的进程,并等待其完成。
我希望你可以将 .net framework system.dll 或其他内容添加到项目引用中,这样你就可以轻松地执行以下操作:
Dim ALongTime As Integer = 2000
System.Threading.Thread.Sleep(ALongTime)
每次都很麻烦。我在我的机器上有VB6和VB.net 2008,而且在两个非常不同的IDE之间切换总是很困难。
System.Threading.Thread.Sleep(500)