如何在Visual Basic (VB6)中延迟代码执行?

13

我有一个需要长时间运行的VB6进程,在执行下一行代码之前,我想要它完成。我该如何做?是否有内置函数可以实现?我能控制等待的时间吗?

简单示例:

Call ExternalLongRunningProcess
Call DoOtherStuff

我该如何延迟执行 'DoOtherStuff'?


1
你能提供更多细节吗?如果这是一个外部进程,那么你是如何调用它的? - Ben Hoffstein
8个回答

17

虽然 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是必要的。


6
谢谢提醒我不再需要做VB6,我为你点赞! - Matt
1
我投票支持你,因为你提供了这个网站擅长的东西。易于找到、相关和准确的建议。@Matt,我也很乐意不使用VB6,但我的客户需要它,所以我会挺身而出。感谢Kris,我不必费时一个小时来记住10年前忘记的“do events”和“sleep”的精确组合。谢谢Kris,它像魔法一样奏效! - William
如果您在十年后仍在阅读此内容,如果您无法让VB6识别导入的Sleep子程序,请尝试将其声明放置在全局模块中。然后,在那里使用它,或者使其公开以便您可以在其他地方使用它。由于某种原因,VB6不喜欢在类模块内部进行此声明。它不会直接抱怨,但它会告诉您Sleep未定义。 - Daniel

16

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

1
DoEvents 是在长时间运行的过程中返回控制权给 GUI 的常用方法。 - Sean Gough

2

如何确定壳进程何时已终止:

如果你正在调用外部进程,那么实际上你是在异步地调用它。请参考上述Microsoft支持文档,了解如何等待外部进程完成。


1
如果你想编写一个不需要声明 sleepsleepwait,你可以编写一个使用系统计时器的循环。这是我在运行解释器时进行测试/调试时使用的方法。如果需要,可以在解释器暂停时添加此内容。
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

谢谢 - 这对我来说是一个完美的技巧。 - Martin

0
将您的代码分成两个进程。先运行第一个进程,然后运行您的“长时间运行的进程”,最后运行第二个进程。

0

在当前进程中运行您的长时间运行的进程,并等待其完成。


0

我希望你可以将 .net framework system.dll 或其他内容添加到项目引用中,这样你就可以轻松地执行以下操作:

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

每次都很麻烦。我在我的机器上有VB6和VB.net 2008,而且在两个非常不同的IDE之间切换总是很困难。


-4

System.Threading.Thread.Sleep(500)


1
那是VB.net而不是VB6。 - MarkJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接