diff --git a/include/wx/msw/apptbase.h b/include/wx/msw/apptbase.h index f08f50d148..0284e348d7 100644 --- a/include/wx/msw/apptbase.h +++ b/include/wx/msw/apptbase.h @@ -41,8 +41,14 @@ public: // 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_ diff --git a/src/msw/app.cpp b/src/msw/app.cpp index 1554e8637e..61218c7190 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -227,6 +227,13 @@ bool wxGUIAppTraits::DoMessageFromThreadWait() 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 diff --git a/src/msw/basemsw.cpp b/src/msw/basemsw.cpp index 8ec6130a51..47a9aac846 100644 --- a/src/msw/basemsw.cpp +++ b/src/msw/basemsw.cpp @@ -35,6 +35,15 @@ #include "wx/msw/private.h" +// ============================================================================ +// wxAppTraits implementation +// ============================================================================ + +WXDWORD wxAppTraits::DoSimpleWaitForThread(WXHANDLE hThread) +{ + return ::WaitForSingleObject((HANDLE)hThread, INFINITE); +} + // ============================================================================ // wxConsoleAppTraits implementation // ============================================================================ @@ -73,6 +82,6 @@ bool wxConsoleAppTraits::DoMessageFromThreadWait() WXDWORD wxConsoleAppTraits::WaitForThread(WXHANDLE hThread) { - return ::WaitForSingleObject((HANDLE)hThread, INFINITE); + return DoSimpleWaitForThread(hThread); }