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
This commit is contained in:
Vadim Zeitlin 2007-02-02 23:12:34 +00:00
parent e570a44b37
commit 535920ff93
3 changed files with 24 additions and 2 deletions

View File

@ -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_

View File

@ -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

View File

@ -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);
}