sosed213 писал(а):FLS колбеки вызываются.
Где именно происходит зависание, сложно сказать, т.к. такое бывает только в скомпилированном файле. Т.е. Форма закрывается, а процесс висит.
Возможно в Form_Unload при вызове Abort, висит на WaitForObjectThreadCompletion m_lAsyncID.
sosed213 писал(а):Возможно в Form_Unload при вызове Abort
Все думаю как избежать постоянной инициализации/деинициализации COM.
Можно ли было в модуле modMultiThreading использовать вместо TLS-слота, FLS-слот. Вроде как FLS даже лучше.
Private Sub Command1_Click()
Me.Caption = m_cWimImage.ApplyPath
End Sub
sosed213 писал(а):Во время применения wim-образа, я могу из кода формы обращаться к классу m_cWimImage (чтение свойств, выполнение методов)?
sosed213 писал(а):То происходит зависание. Я так понимаю, что из основного потока я пытаюсь залезть в другой поток. Т.е. как то надо использовать маршалинг?
sosed213 писал(а):Или например, есть API функция Public Declare Function WIMGetMessageCallbackCount Lib "WIMGAPI.DLL" (ByVal hWIM As Long) As Long, если я её захочу её вызвать, нужен будет hWIM, можно было бы прочитать значение m_cWimImage.GethWim.
sosed213 писал(а):Буду пробовать создавать СWimImage в главном потоке.
gHandles = vbCreateThread(0, 0, AddressOf ThreadProc, VarPtr(mtThreadsData), 0, 0)
WaitForObjectThreadCompletion gHandles
Public Function ThreadProc( _
ByRef tData As tThreadData) As Long
If WIMApplyImage(tData.hImage, tData.lpszPath, tData.dzApplyFlags) = 0 Then
tErrNumber = 0: tErrDescrt = "": tErrNumber = Err.LastDllError: tErrDescrt = ErrMessageText(tErrNumber)
PutLog "WIMApplyImage failed " & tErrNumber & " " & tErrDescrt
Err.Raise tErrNumber, "Apply-WIMApplyImage", tErrDescrt
End If
End Function
sosed213 писал(а):Когда использую функцию vbCreateThread, как определить что поток завершился? Пробовал через WaitForObjectThreadCompletion, но событие не наступает.
- Код: Выделить всё
gHandles = vbCreateThread(0, 0, AddressOf ThreadProc, VarPtr(mtThreadsData), 0, 0)
WaitForObjectThreadCompletion gHandles
- Код: Выделить всё
Public Function ThreadProc( _
ByRef tData As tThreadData) As Long
If WIMApplyImage(tData.hImage, tData.lpszPath, tData.dzApplyFlags) = 0 Then
tErrNumber = 0: tErrDescrt = "": tErrNumber = Err.LastDllError: tErrDescrt = ErrMessageText(tErrNumber)
PutLog "WIMApplyImage failed " & tErrNumber & " " & tErrDescrt
Err.Raise tErrNumber, "Apply-WIMApplyImage", tErrDescrt
End If
End Function
sosed213 писал(а):Если использовать WaitForSingleObject, то форма зависает до завершения применения файла. Я это пробовал сразу.
sosed213 писал(а):Сложная штука - потоки. Я совсем запутался.
Получается что нельзя чтобы было удобно и чтобы при этом работало?
sosed213 писал(а):Я хочу реализовать полноценное использование библиотеки wingapi, для дальнейшего использования. Хочу чтобы работа с классом была гибкой. В частности чтобы во время выполнении длительной операции (применении, захвата, монтирования образа), не было зависания формы, был рабочий колбек, и была возможность взаимодействия с классом.
The trick, твой крайний пример, это лучшее на что я мог бы рассчитывать. Спасибо тебе большое!
sosed213 писал(а):Т.е. в методе-колбек Applied, нужно убрать Abort, а CloseAll оставить?
sosed213 писал(а):А вообще хорошо бы перед вызовом WaitForObjectThreadCompletion m_lAsyncID, проверять существует ли еще асинхронный вызов, по m_lAsyncID. Есть такая возможность?
sosed213 писал(а):И вопрос по обработке ошибок.
Если в классе CWIMImageThead, в методе Apply возникнет ошибка, как ее обработать? Т.е. как ее переправить в какую нибудь процедуру (похожую на Applied), чтобы потом с ней работать? В PutLog ошибку видно.
Или можно сделать такую же функцию как PutLog, но для ошибок?
The trick писал(а):можно Sub Apply переделать в функцию и через возвращаемое значение смотреть (оно пойдет в Applied, параметр vRet).
sosed213 писал(а):The trick писал(а):можно Sub Apply переделать в функцию и через возвращаемое значение смотреть (оно пойдет в Applied, параметр vRet).
Это я сдела.
Но Applied срабатывает только в случае успешного выполнения функции WIMApplyImage.
В случае генерации ошибки (например закончилось место на диске или установить флаг m_bAbort), метод Applied не наступает.
If WIMApplyImage(m_hCurImage, StrPtr(m_sApplyPath), WIM_FLAG_VERIFY Or WIM_FLAG_NO_RP_FIX Or WIM_FLAG_NO_DIRACL Or WIM_FLAG_NO_FILEACL) = 0 Then
tErrNumber = 0: tErrDescrt = "": tErrNumber = Err.LastDllError: tErrDescrt = ErrMessageText(tErrNumber)
PutLog "WIMApplyImage(2) failed " & tErrNumber & " " & tErrDescrt
Err.Raise tErrNumber, "Apply-WIMApplyImage", tErrDescrt
End If
sosed213 писал(а):Не могу понять что упускаю. Вроде и колбеки все отключаю, и хендлы все закрываю.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 57