X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad0500fb78615f351bea58e6aa7e4f46bd091546..2654f7e423bb773ca52c8b465c6ec9abfa398e45:/src/os2/thread.cpp diff --git a/src/os2/thread.cpp b/src/os2/thread.cpp index 5c73b1a6ce..738a99a758 100644 --- a/src/os2/thread.cpp +++ b/src/os2/thread.cpp @@ -6,7 +6,7 @@ // Created: 04/22/98 // RCS-ID: $Id$ // Copyright: (c) Stefan Neis (2003) -// +// // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -26,6 +26,7 @@ #include #include "wx/app.h" +#include "wx/apptrait.h" #include "wx/module.h" #include "wx/intl.h" #include "wx/utils.h" @@ -409,18 +410,21 @@ void wxThreadInternal::OS2ThreadStart( } else // do run thread { - HAB vHab; - vHab = ::WinInitialize(0); + wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + unsigned long ulHab; + if (traits) + traits->InitializeGui(ulHab); dwRet = (DWORD)pThread->Entry(); - ::WinTerminate(vHab); + if (traits) + traits->TerminateGui(ulHab); - // enter m_critsect before changing the thread state - pThread->m_critsect.Enter(); + // enter m_critsect before changing the thread state + pThread->m_critsect.Enter(); - bWasCancelled = pThread->m_internal->GetState() == STATE_CANCELED; + bWasCancelled = pThread->m_internal->GetState() == STATE_CANCELED; - pThread->m_internal->SetState(STATE_EXITED); - pThread->m_critsect.Leave(); + pThread->m_internal->SetState(STATE_EXITED); + pThread->m_critsect.Leave(); } pThread->OnExit(); @@ -476,12 +480,12 @@ bool wxThreadInternal::Create( ) { int tid; - + if (!uStackSize) uStackSize = 131072; pThread->m_critsect.Enter(); tid = _beginthread(wxThreadInternal::OS2ThreadStart, - NULL, uStackSize, pThread); + NULL, uStackSize, pThread); if(tid == -1) { wxLogSysError(_("Can't create thread")); @@ -658,9 +662,9 @@ wxThreadError wxThread::Resume() { if (m_internal->GetState() == STATE_NEW) { - m_internal->SetState(STATE_RUNNING); + m_internal->SetState(STATE_RUNNING); m_critsect.Leave(); - return wxTHREAD_NO_ERROR; + return wxTHREAD_NO_ERROR; } wxCriticalSectionLocker lock((wxCriticalSection &)m_critsect); @@ -730,7 +734,7 @@ wxThreadError wxThread::Delete(ExitCode *pRc) { // set flag for wxIsWaitingForThread() gs_bWaitingForThread = TRUE; - } + } // ask the thread to terminate if ( shouldCancel ) @@ -740,7 +744,7 @@ wxThreadError wxThread::Delete(ExitCode *pRc) m_internal->Cancel(); } -#if wxUSE_GUI +#if 0 // 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 @@ -758,41 +762,41 @@ wxThreadError wxThread::Delete(ExitCode *pRc) } result = ::DosWaitThread(&hThread, DCWW_NOWAIT); - // FIXME: We ought to have a message processing loop here!! + // FIXME: We ought to have a message processing loop here!! switch ( result ) - { - case ERROR_INTERRUPT: - case ERROR_THREAD_NOT_TERMINATED: - break; - case ERROR_INVALID_THREADID: + { + case ERROR_INTERRUPT: + case ERROR_THREAD_NOT_TERMINATED: + break; + case ERROR_INVALID_THREADID: case NO_ERROR: // thread we're waiting for just terminated - // or even does not exist any more. - result = NO_ERROR; - break; + // or even does not exist any more. + result = NO_ERROR; + break; default: wxFAIL_MSG(wxT("unexpected result of DosWaitThread")); } - if ( IsMain() ) - { - // event processing - needed if we are the main thread - // to give other threads a chance to do remaining GUI - // processing and terminate cleanly. - wxTheApp->HandleSockets(); - if (wxTheApp->Pending()) - if ( !wxTheApp->DoMessage() ) - { - // WM_QUIT received: kill the thread - Kill(); - - return wxTHREAD_KILLED; - } - else - wxUsleep(10); - } - else - wxUsleep(10); + if ( IsMain() ) + { + // event processing - needed if we are the main thread + // to give other threads a chance to do remaining GUI + // processing and terminate cleanly. + wxTheApp->HandleSockets(); + if (wxTheApp->Pending()) + if ( !wxTheApp->DoMessage() ) + { + // WM_QUIT received: kill the thread + Kill(); + + return wxTHREAD_KILLED; + } + else + wxUsleep(10); + } + else + wxUsleep(10); } while ( result != NO_ERROR ); #else // !wxUSE_GUI // simply wait for the thread to terminate