0

我正在使用专有的 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() 之前,如何安全正确地等待事件回调触发?

4

1 回答 1

4

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

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

否则,您也可以尝试status = 2在调用MsgBox "Finished".

于 2011-11-22T09:19:17.977 回答