Multithreading VB6不能按预期工作
我正在使用专有的VB6 COM库。库中有一些函数可以启动,一旦通过事件完成,我就会得到结果 集装箱类别:Multithreading VB6不能按预期工作,multithreading,events,vb6,doevents,Multithreading,Events,Vb6,Doevents,我正在使用专有的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 A
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”消息后运行debug时暂停代码,代码当前正在执行DoEvents,myObj.Status=1,就好像从未接触过一样
似乎是为一个单独的线程创建了一个不同的对象实例?在继续执行下一个DoIt2()之前,如何安全、正确地等待事件回调触发?您需要使用本地
状态
变量,因为这是您要设置为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
,您需要使用本地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
,因为当它接收到中断消息时,中断代码几乎肯定会在DoEvents上暂停。Ctrl+Break将在任何地方接收,并且可能在其他任何地方中断。中断代码几乎肯定会在DoEvents上暂停,因为此时它将接收中断消息。Ctrl+Break将在任何位置接收,并且可能在其他任何位置中断。