2011-11-22 53 views
0

我正在使用专有的VB6 COM库。图书馆有一些功能可以触发,我通过活动完成一次结果。VB6 DoEvents不按预期工作

容器类:

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永远不会触发。事实上,如果我在看到“Finished”消息后运行调试时暂停我的代码,那么代码当前正在执行DoEvents,并且myObj.Status = 1就好像它从未被触摸过一样。

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

+2

破入代码将在作为的DoEvents几乎certianly暂停是当它会收到中断消息。 Ctrl + Break将在任何地方接收,并可能在其他地方破解。 – Deanna

回答

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() 

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