我正在使用专有的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()之前,如何安全正确地等待事件回调激活?
答案 0 :(得分: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"
。