X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/077309e1a38c65d7d236f06b4d54e67ffcf897bf..ce51dc7507f31a6baadb8709ac4b807cd2dad421:/src/msw/thread.cpp diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp index 2180ddd994..92f34c9ca8 100644 --- a/src/msw/thread.cpp +++ b/src/msw/thread.cpp @@ -174,6 +174,8 @@ private: wxMutexError LockTimeout(DWORD milliseconds); HANDLE m_mutex; + + DECLARE_NO_COPY_CLASS(wxMutexInternal) }; // all mutexes are recursive under Win32 so we don't use mutexType @@ -243,7 +245,7 @@ wxMutexError wxMutexInternal::Unlock() { if ( !::ReleaseMutex(m_mutex) ) { - wxLogLastError(_("ReleaseMutex()")); + wxLogLastError(_T("ReleaseMutex()")); return wxMUTEX_MISC_ERROR; } @@ -265,13 +267,24 @@ public: bool IsOk() const { return m_semaphore != NULL; } wxSemaError Wait() { return WaitTimeout(INFINITE); } - wxSemaError TryWait() { return WaitTimeout(0); } + + wxSemaError TryWait() + { + wxSemaError rc = WaitTimeout(0); + if ( rc == wxSEMA_TIMEOUT ) + rc = wxSEMA_BUSY; + + return rc; + } + wxSemaError WaitTimeout(unsigned long milliseconds); wxSemaError Post(); private: HANDLE m_semaphore; + + DECLARE_NO_COPY_CLASS(wxSemaphoreInternal) }; wxSemaphoreInternal::wxSemaphoreInternal(int initialcount, int maxcount) @@ -317,7 +330,7 @@ wxSemaError wxSemaphoreInternal::WaitTimeout(unsigned long milliseconds) return wxSEMA_NO_ERROR; case WAIT_TIMEOUT: - return wxSEMA_BUSY; + return wxSEMA_TIMEOUT; default: wxLogLastError(_T("WaitForSingleObject(semaphore)")); @@ -536,6 +549,8 @@ private: wxThreadState m_state; // state, see wxThreadState enum unsigned int m_priority; // thread priority in "wx" units DWORD m_tid; // thread id + + DECLARE_NO_COPY_CLASS(wxThreadInternal) }; THREAD_RETVAL THREAD_CALLCONV wxThreadInternal::WinThreadStart(void *param) @@ -659,6 +674,8 @@ bool wxThreadInternal::Create(wxThread *thread, unsigned int stackSize) SetPriority(m_priority); } + m_state = STATE_NEW; + return TRUE; } @@ -965,30 +982,8 @@ wxThreadError wxThread::Delete(ExitCode *pRc) HANDLE hThread = m_internal->GetHandle(); - // Check if thread is really still running. There is a - // race condition in WinThreadStart between the time the - // m_internal->m_state is set to STATE_EXITED and the win32 - // thread actually exits. It can be flagged as STATE_EXITED - // and then we don't wait for it to exit. This will cause - // GetExitCodeThread to return STILL_ACTIVE. - if ( !isRunning ) - { - if ( !IsRunning() ) - { - if ( ::GetExitCodeThread(hThread, (LPDWORD)&rc) ) - { - if ((DWORD)rc == STILL_ACTIVE) - isRunning = TRUE; - } - } - else - { - isRunning = TRUE; - } - } - - // does it still run? - if ( isRunning ) + // does is still run? + if ( isRunning || IsRunning() ) { if ( IsMain() ) { @@ -1044,24 +1039,13 @@ wxThreadError wxThread::Delete(ExitCode *pRc) break; case WAIT_OBJECT_0 + 1: + // new message arrived, process it + if ( !wxTheApp->DoMessage() ) { - MSG peekMsg; - // Check if a new message has really arrived. - // MsgWaitForMultipleObjects can indicate that a message - // is ready for processing, but this message may be sucked - // up by GetMessage and then GetMessage will hang and not - // allow us to process the actual thread exit event. - if (::PeekMessage(&peekMsg, (HWND) NULL, 0, 0, PM_NOREMOVE)) - { - // new message arrived, process it - if ( !wxTheApp->DoMessage() ) - { - // WM_QUIT received: kill the thread - Kill(); - - return wxTHREAD_KILLED; - } - } + // WM_QUIT received: kill the thread + Kill(); + + return wxTHREAD_KILLED; } break;