Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading VB6不能按预期工作_Multithreading_Events_Vb6_Doevents - Fatal编程技术网

Multithreading VB6不能按预期工作

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

我正在使用专有的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从未启动。事实上,如果在看到“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将在任何位置接收,并且可能在其他任何位置中断。