【问题标题】:VB6 DoEvents not Working as DesiredVB6 DoEvents 没有按预期工作
【发布时间】:2011-12-29 11:49:06
【问题描述】:

我正在使用专有的 VB6 COM 库。该库有一些可以触发的函数,一旦通过事件完成,我就会得到结果。

容器类:

Private WithEvents myObj As proprietaryObj
Public status as Integer
Set myObj = new proprietaryObj
status = 1
Call myObj.DoIt1()

...

' Call back event function
Private Sub myObj_Done(ByVal Code As Long)
    ...
    MsgBox "Finished"
    status = 2
End Sub

所以一切正常(已验证)。我要做的就是将上面的代码+更多封装在一个类中,这样我就可以将多个需要堆叠的函数封装起来,或者在回调成功后连续执行。

所以我继续这样做:

Call myObj.DoIt1()
Do
    If myObj.Status = 2 Then Exit Do
    If myObj.Status = -1 Then Exit Do 'Error
    DoEvents
Loop
call myObj.DoIt2()

我得到“完成”对话框,但 DoIt2 从未触发。事实上,如果我在看到“已完成”消息后在运行调试时暂停我的代码,则代码当前正在执行 DoEvents,并且 myObj.Status = 1 就好像它从未被触及过一样。

看起来好像对象的不同实例是为单独的线程创建的?在使用下一个 DoIt2() 继续执行之前,如何安全且正确地等待事件回调触发?

【问题讨论】:

  • 闯入代码几乎肯定会在 DoEvents 上暂停,因为它会收到中断消息。 Ctrl+Break 将在任何地方收到,并且可以在其他任何地方中断。

标签: multithreading events vb6 doevents


【解决方案1】:

您需要使用本地 status 变量,因为这是您设置为 2 的变量:

Call myObj.DoIt1()
Do
    If status = 2 Then Exit Do
    If status = -1 Then Exit Do 'Error
    DoEvents
Loop
call myObj.DoIt2()

否则,您也可以尝试在调用 MsgBox "Finished" 之前设置 status = 2

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    • 2011-09-07
    • 2013-03-03
    • 2015-05-18
    相关资源
    最近更新 更多