Объект 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 - это одна и та же версия.

0 ответов

Другие вопросы по тегам