]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/thread.cpp
regenerated project/makefiles with tmake
[wxWidgets.git] / src / msw / thread.cpp
index d93d017704c2d27c7abe938b44eee16dd8d89bc1..195a2de6c721aedca6aa659d972aaeba133972dc 100644 (file)
 #endif
 
 #ifndef WX_PRECOMP
-#    include "wx/wx.h"
 #endif
 
 #if wxUSE_THREADS
 
+#include "wx/apptrait.h"
+
 #include "wx/msw/private.h"
 #include "wx/msw/missing.h"
 
@@ -174,6 +175,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 +246,7 @@ wxMutexError wxMutexInternal::Unlock()
 {
     if ( !::ReleaseMutex(m_mutex) )
     {
-        wxLogLastError(_("ReleaseMutex()"));
+        wxLogLastError(_T("ReleaseMutex()"));
 
         return wxMUTEX_MISC_ERROR;
     }
@@ -265,13 +268,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 +331,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 +550,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)
@@ -614,6 +630,9 @@ void wxThreadInternal::SetPriority(unsigned int priority)
 
 bool wxThreadInternal::Create(wxThread *thread, unsigned int stackSize)
 {
+    wxASSERT_MSG( m_state == STATE_NEW && !m_hThread,
+                    _T("Create()ing thread twice?") );
+
     // for compilers which have it, we should use C RTL function for thread
     // creation instead of Win32 API one because otherwise we will have memory
     // leaks if the thread uses C RTL (and most threads do)
@@ -982,10 +1001,11 @@ wxThreadError wxThread::Delete(ExitCode *pRc)
             m_internal->Cancel();
         }
 
-#if wxUSE_GUI
         // we can't just wait for the thread to terminate because it might be
         // calling some GUI functions and so it will never terminate before we
         // process the Windows messages that result from these functions
+        // (note that even in console applications we might have to process
+        // messages if we use wxExecute() or timers or ...)
         DWORD result = 0;       // suppress warnings from broken compilers
         do
         {
@@ -1023,12 +1043,17 @@ wxThreadError wxThread::Delete(ExitCode *pRc)
 
                 case WAIT_OBJECT_0 + 1:
                     // new message arrived, process it
-                    if ( !wxTheApp->DoMessage() )
                     {
-                        // WM_QUIT received: kill the thread
-                        Kill();
+                        wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits()
+                                                       : NULL;
+
+                        if ( traits && !traits->DoMessageFromThreadWait() )
+                        {
+                            // WM_QUIT received: kill the thread
+                            Kill();
 
-                        return wxTHREAD_KILLED;
+                            return wxTHREAD_KILLED;
+                        }
                     }
                     break;
 
@@ -1036,16 +1061,6 @@ wxThreadError wxThread::Delete(ExitCode *pRc)
                     wxFAIL_MSG(wxT("unexpected result of MsgWaitForMultipleObject"));
             }
         } while ( result != WAIT_OBJECT_0 );
-#else // !wxUSE_GUI
-        // simply wait for the thread to terminate
-        //
-        // OTOH, even console apps create windows (in wxExecute, for WinSock
-        // &c), so may be use MsgWaitForMultipleObject() too here?
-        if ( WaitForSingleObject(hThread, INFINITE) != WAIT_OBJECT_0 )
-        {
-            wxFAIL_MSG(wxT("unexpected result of WaitForSingleObject"));
-        }
-#endif // wxUSE_GUI/!wxUSE_GUI
 
         if ( IsMain() )
         {