// false if and only if we have to exit the application
virtual bool DoMessageFromThreadWait() = 0;
- // wait for the handle to be signaled
+ // wait for the handle to be signaled, return WAIT_OBJECT_0 if it is or, in
+ // the GUI code, WAIT_OBJECT_0 + 1 if a Windows message arrived
virtual WXDWORD WaitForThread(WXHANDLE hThread) = 0;
+
+protected:
+ // implementation of WaitForThread() for the console applications which is
+ // also used by the GUI code if it doesn't [yet|already} dispatch events
+ WXDWORD DoSimpleWaitForThread(WXHANDLE hThread);
};
#endif // _WX_MSW_APPTBASE_H_
DWORD wxGUIAppTraits::WaitForThread(WXHANDLE hThread)
{
+ // if we don't have a running event loop, we shouldn't wait for the
+ // messages as we never remove them from the message queue and so we enter
+ // an infinite loop as MsgWaitForMultipleObjects() keeps returning
+ // WAIT_OBJECT_0 + 1
+ if ( !wxEventLoop::GetActive() )
+ return DoSimpleWaitForThread(hThread);
+
return ::MsgWaitForMultipleObjects
(
1, // number of objects to wait for
#include "wx/msw/private.h"
+// ============================================================================
+// wxAppTraits implementation
+// ============================================================================
+
+WXDWORD wxAppTraits::DoSimpleWaitForThread(WXHANDLE hThread)
+{
+ return ::WaitForSingleObject((HANDLE)hThread, INFINITE);
+}
+
// ============================================================================
// wxConsoleAppTraits implementation
// ============================================================================
WXDWORD wxConsoleAppTraits::WaitForThread(WXHANDLE hThread)
{
- return ::WaitForSingleObject((HANDLE)hThread, INFINITE);
+ return DoSimpleWaitForThread(hThread);
}