VB6 DoEvents не работает как нужно - PullRequest
0 голосов
/ 22 ноября 2011

Я работаю с проприетарной библиотекой 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 ()?

1 Ответ

4 голосов
/ 22 ноября 2011

Вам необходимо использовать локальную переменную 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".

...