Предлагается изиенить AtlWaitWithMessageLoop, чтобы выходить по таймауту (для еветна)
Какие идеи? Может так:
BOOL AtlWaitWithMessageLoop_WithTimeOut(HANDLE hEvent, DWORD timeOut = INFINITE)
{
DWORD dwRet;
MSG msg;
// здесь ...
DWORD start = ::GetTickCount();
DWORD duration = 0;
while(1)
{
dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, timeOut, QS_ALLINPUT);
if (dwRet == WAIT_OBJECT_0)
return TRUE; // The event was signaled
if (dwRet != WAIT_OBJECT_0 + 1)
break; // Something else happened
// There is one or more window message available. Dispatch them
while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
return TRUE; // Event is now signaled.
// и здесь ...
duration = ::GetTickCount() - start;
if( duration > timeOut ) {
return FALSE;
}
}
}
return FALSE;
}
---
Fixed a bug if( duration > timeOut ) { return TRUE; } should be f( duration > timeOut ) { return FALSE; }
|