Объект Waitforsignle всегда находится в состоянии ожидания
У меня проблема с событиями и waitforsingleobject(), которые всегда возвращаются в тайм-аут.
У меня есть 4 компьютера, где этот код запускает 1 - рабочий стол, 3 - ноутбуки. На ноутбуках ничего не работает, приемник всегда тайм-аут при ожидании события. на рабочем столе, только в одном конкретном случае (и только при первом вызове после запуска программного обеспечения в этом случае) он не работает. В остальное время это работает как шарм.
У меня есть DLL (emeter), который создает буфер, содержащий изображение из продукта. затем он запускает событие, которое было ему передано второй DLL (супервизором), чтобы сообщить третьему (получателю), что изображение доступно в памяти. (Я не сделал этот выбор архитектуры, я должен иметь дело с этим).
Вот код в контрольной DLL, которая создает событие и передает обработчик в DLL-библиотеку emeter и приемника (C CVI):
//Création de l'évenement de notification d'une nouvelle image
phVideo[ iNumeroBusVideo ] = CreateEvent (NULL, FALSE, FALSE, NULL);
// Configuration du bus
// if( gprProduitSelectionne->prBusData[iNumeroBusVideo].iTypeBusCommunication == FIREWIRE ) // ADU
{
error = DllConfigureVideoEvent(iNumeroBusVideo, phVideo[ iNumeroBusVideo ]); //passage of the handler to the emeter DLL
}
и переход обработчика к DLL-приемнику с помощью сообщения Windows:
rMessageAffichageVideo.pucImageBuffer = m_pucImageBuffer;
rMessageAffichageVideo.hEventVideo = phVideo[ rMessageAffichageVideo.ucNumeroSession ];
if(!PostMessage (HWND_BROADCAST, iMessageAffichageVideo, 0, (LPARAM)&rMessageAffichageVideo))
error = -666;
Вот код, в котором обработчик события передается первой DLL, а затем устанавливается (C++):
extern "C" int __declspec(dllexport) ConfigureVideoEvent (int iNumeroSession, HANDLE hVideoEvent)
{
int error = 0;
error=BMO_1394[iNumeroSession].BMO_Iso_Listener.VideoEvent(hVideoEvent); // code erreur non significatif
if (error < 0)
giError = error;
return error;
}
int CBMOIsoListener::VideoEvent (HANDLE hVideoEvent)
{
int error = 0;
hEventVideoConfig = hVideoEvent;
bEventVideoConfig = true;
return error;
}
int CBMOIsoListener::DisplayVideo()
{
CDebug Debug("C:\\BMO-BDA IBIS II WIN-10\\Traces\\DebugVideo.log", "MSG1394", TRUE, FALSE);
// Copie de l'image dans le buffer
Debug.Printf("DEB CBMOIsoListener::DisplayVideo()");
int error = 0;
[…]
// Notification nouvelle image à afficher
if (bEventVideoConfig){
::SetEvent(hEventVideoConfig);
Debug.Printf("Event Set = %x", hEventVideoConfig);
}
Debug.Printf("FIN CBMOIsoListener::DisplayVideo()");
return error;
}
Вот код, который отслеживает событие, и тот, который всегда возвращает время ожидания в DLL-приемнике (снова C++):
while ( !bFin && !pEnregViewerExterne->IsStopVideo() )
{
dwResultEvent = WaitForSingleObject ( pEnregViewerExterne->GethEventVideo(), 500);
switch (dwResultEvent)
{
case WAIT_TIMEOUT:
// Pas de nouvelle image video
if(pEnregViewerExterne->GetDebug()!=NULL) pEnregViewerExterne->GetDebug()->PrintfFlag( true, true, "CEnregViewerExterne:ThreadAcqVideo VIDEO_TIMEOUT on handle %x", pEnregViewerExterne->GethEventVideo());
break;
Все 3 ПК - Windows 10, без перекомпиляции, одна и та же DLL используется. Существует разница в версии для Windows 10 между ноутбуками и другими ПК, но все фреймворки и vist ++ redist - это одна и та же версия.