+ // we should return false only if the app should exit, i.e. only if
+ // Dispatch() determines that the main event loop should terminate
+ wxEventLoopBase * const evtLoop = wxEventLoop::GetActive();
+ if ( !evtLoop || !evtLoop->Pending() )
+ {
+ // no events means no quit event
+ return true;
+ }
+
+ return evtLoop->Dispatch();
+}
+
+DWORD wxGUIAppTraits::WaitForThread(WXHANDLE hThread, int flags)
+{
+ // We only ever dispatch messages from the main thread and, additionally,
+ // even from the main thread we shouldn't wait for the message if we don't
+ // have a running event loop as we would never remove them from the message
+ // queue then and so we would enter an infinite loop as
+ // MsgWaitForMultipleObjects() keeps returning WAIT_OBJECT_0 + 1.
+ if ( flags == wxTHREAD_WAIT_BLOCK ||
+ !wxIsMainThread() ||
+ !wxEventLoop::GetActive() )
+ {
+ // Simple blocking wait.
+ return DoSimpleWaitForThread(hThread);
+ }
+
+ return ::MsgWaitForMultipleObjects
+ (
+ 1, // number of objects to wait for
+ (HANDLE *)&hThread, // the objects
+ false, // wait for any objects, not all
+ INFINITE, // no timeout
+ QS_ALLINPUT | // return as soon as there are any events
+ QS_ALLPOSTMESSAGE
+ );