X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/077309e1a38c65d7d236f06b4d54e67ffcf897bf..1cff04deb5c17c95bef9c83e72645f105b90e750:/src/msw/thread.cpp diff --git a/src/msw/thread.cpp b/src/msw/thread.cpp index 2180ddd994..cf2353b615 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; } @@ -272,6 +274,8 @@ public: private: HANDLE m_semaphore; + + DECLARE_NO_COPY_CLASS(wxSemaphoreInternal) }; wxSemaphoreInternal::wxSemaphoreInternal(int initialcount, int maxcount) @@ -536,6 +540,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) @@ -965,30 +971,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 +1028,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;