From 535920ff9337a31829ab1618a199752c49bff402 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 2 Feb 2007 23:12:34 +0000 Subject: [PATCH] don't wait for Windows messages in WaitForThread() if we don't dispatch events (should fix the bugs 1523302 and 1650795) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44345 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/apptbase.h | 8 +++++++- src/msw/app.cpp | 7 +++++++ src/msw/basemsw.cpp | 11 ++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) 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); } -- 2.45.2