Allow wxThread::Wait() and Delete() to block, even under wxMSW.
Add "wait mode" parameter to these methods which can be used to make them block even under wxMSW where they currently dispatch messages when called which can be totally unexpected. Do keep the old behaviour for compatibility however, although it will change i 3.2. Closes #12998. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67185 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -40,7 +40,7 @@ public:
|
||||
|
||||
// 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;
|
||||
virtual WXDWORD WaitForThread(WXHANDLE hThread, int flags) = 0;
|
||||
|
||||
|
||||
#ifndef __WXWINCE__
|
||||
|
@@ -26,7 +26,7 @@ public:
|
||||
virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer);
|
||||
#endif
|
||||
virtual bool DoMessageFromThreadWait();
|
||||
virtual WXDWORD WaitForThread(WXHANDLE hThread);
|
||||
virtual WXDWORD WaitForThread(WXHANDLE hThread, int flags);
|
||||
#ifndef __WXWINCE__
|
||||
virtual bool CanUseStderr() { return true; }
|
||||
virtual bool WriteToStderr(const wxString& text);
|
||||
@@ -46,7 +46,7 @@ public:
|
||||
#endif
|
||||
virtual bool DoMessageFromThreadWait();
|
||||
virtual wxPortId GetToolkitVersion(int *majVer = NULL, int *minVer = NULL) const;
|
||||
virtual WXDWORD WaitForThread(WXHANDLE hThread);
|
||||
virtual WXDWORD WaitForThread(WXHANDLE hThread, int flags);
|
||||
|
||||
#ifndef __WXWINCE__
|
||||
virtual bool CanUseStderr();
|
||||
|
@@ -71,6 +71,21 @@ enum wxThreadKind
|
||||
wxTHREAD_JOINABLE
|
||||
};
|
||||
|
||||
enum wxThreadWait
|
||||
{
|
||||
wxTHREAD_WAIT_BLOCK,
|
||||
wxTHREAD_WAIT_YIELD, // process events while waiting; MSW only
|
||||
|
||||
// For compatibility reasons we use wxTHREAD_WAIT_YIELD by default as this
|
||||
// was the default behaviour of wxMSW 2.8 but it should be avoided as it's
|
||||
// dangerous and not portable.
|
||||
#if WXWIN_COMPATIBILITY_2_8
|
||||
wxTHREAD_WAIT_DEFAULT = wxTHREAD_WAIT_YIELD
|
||||
#else
|
||||
wxTHREAD_WAIT_DEFAULT = wxTHREAD_WAIT_BLOCK
|
||||
#endif
|
||||
};
|
||||
|
||||
// defines the interval of priority
|
||||
enum
|
||||
{
|
||||
@@ -516,13 +531,14 @@ public:
|
||||
// does it!
|
||||
//
|
||||
// will fill the rc pointer with the thread exit code if it's !NULL
|
||||
wxThreadError Delete(ExitCode *rc = NULL);
|
||||
wxThreadError Delete(ExitCode *rc = NULL,
|
||||
wxThreadWait waitMode = wxTHREAD_WAIT_DEFAULT);
|
||||
|
||||
// waits for a joinable thread to finish and returns its exit code
|
||||
//
|
||||
// Returns (ExitCode)-1 on error (for example, if the thread is not
|
||||
// joinable)
|
||||
ExitCode Wait();
|
||||
ExitCode Wait(wxThreadWait waitMode = wxTHREAD_WAIT_DEFAULT);
|
||||
|
||||
// kills the thread without giving it any chance to clean up - should
|
||||
// not be used under normal circumstances, use Delete() instead.
|
||||
|
Reference in New Issue
Block a user