1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     interface of all thread-related wxWidgets classes 
   4 // Author:      wxWidgets team 
   6 // Licence:     wxWindows license 
   7 ///////////////////////////////////////////////////////////////////////////// 
  10 /** See wxCondition. */ 
  15     wxCOND_TIMEOUT
,         //!< WaitTimeout() has timed out 
  23     wxCondition variables correspond to pthread conditions or to Win32 event objects. 
  24     They may be used in a multithreaded application to wait until the given condition 
  25     becomes @true which happens when the condition becomes signaled. 
  27     For example, if a worker thread is doing some long task and another thread has 
  28     to wait until it is finished, the latter thread will wait on the condition 
  29     object and the worker thread will signal it on exit (this example is not 
  30     perfect because in this particular case it would be much better to just 
  31     wxThread::Wait for the worker thread, but if there are several worker threads 
  32     it already makes much more sense). 
  34     Note that a call to wxCondition::Signal may happen before the other thread calls 
  35     wxCondition::Wait and, just as with the pthread conditions, the signal is then 
  36     lost and so if you want to be sure that you don't miss it you must keep the 
  37     mutex associated with the condition initially locked and lock it again before calling 
  38     wxCondition::Signal. Of course, this means that this call is going to block 
  39     until wxCondition::Wait is called by another thread. 
  41     @section condition_example Example 
  43     This example shows how a main thread may launch a worker thread which starts 
  44     running and then waits until the main thread signals it to continue: 
  47     class MySignallingThread : public wxThread 
  50         MySignallingThread(wxMutex *mutex, wxCondition *condition) 
  53             m_condition = condition; 
  58         virtual ExitCode Entry() 
  62             // tell the other(s) thread(s) that we're about to terminate: we must 
  63             // lock the mutex first or we might signal the condition before the 
  64             // waiting threads start waiting on it! 
  65             wxMutexLocker lock(*m_mutex); 
  66             m_condition->Broadcast(); // same as Signal() here -- one waiter only 
  72         wxCondition *m_condition; 
  79         wxCondition condition(mutex); 
  81         // the mutex should be initially locked 
  84         // create and run the thread but notice that it won't be able to 
  85         // exit (and signal its exit) before we unlock the mutex below 
  86         MySignallingThread *thread = new MySignallingThread(&mutex, &condition); 
  90         // wait for the thread termination: Wait() atomically unlocks the mutex 
  91         // which allows the thread to continue and starts waiting 
  99     Of course, here it would be much better to simply use a joinable thread and 
 100     call wxThread::Wait on it, but this example does illustrate the importance of 
 101     properly locking the mutex when using wxCondition. 
 106     @see wxThread, wxMutex 
 112         Default and only constructor. 
 113         The @a mutex must be locked by the caller before calling Wait() function. 
 114         Use IsOk() to check if the object was successfully initialized. 
 116     wxCondition(wxMutex
& mutex
); 
 119         Destroys the wxCondition object. 
 121         The destructor is not virtual so this class should not be used polymorphically. 
 126         Broadcasts to all waiting threads, waking all of them up. 
 128         Note that this method may be called whether the mutex associated with 
 129         this condition is locked or not. 
 133     wxCondError 
Broadcast(); 
 136         Returns @true if the object had been initialized successfully, @false 
 137         if an error occurred. 
 142         Signals the object waking up at most one thread. 
 144         If several threads are waiting on the same condition, the exact thread 
 145         which is woken up is undefined. If no threads are waiting, the signal is 
 146         lost and the condition would have to be signalled again to wake up any 
 147         thread which may start waiting on it later. 
 149         Note that this method may be called whether the mutex associated with this 
 150         condition is locked or not. 
 154     wxCondError 
Signal(); 
 157         Waits until the condition is signalled. 
 159         This method atomically releases the lock on the mutex associated with this 
 160         condition (this is why it must be locked prior to calling Wait()) and puts the 
 161         thread to sleep until Signal() or  Broadcast() is called. 
 162         It then locks the mutex again and returns. 
 164         Note that even if Signal() had been called before Wait() without waking 
 165         up any thread, the thread would still wait for another one and so it is 
 166         important to ensure that the condition will be signalled after 
 167         Wait() or the thread may sleep forever. 
 169         @return Returns wxCOND_NO_ERROR on success, another value if an error occurred. 
 176         Waits until the condition is signalled or the timeout has elapsed. 
 178         This method is identical to Wait() except that it returns, with the 
 179         return code of @c wxCOND_TIMEOUT as soon as the given timeout expires. 
 182             Timeout in milliseconds 
 184         @return Returns wxCOND_NO_ERROR if the condition was signalled, 
 185                 wxCOND_TIMEOUT if the timeout elapsed before this happened or 
 186                 another error code from wxCondError enum. 
 188     wxCondError 
WaitTimeout(unsigned long milliseconds
); 
 193     @class wxCriticalSectionLocker 
 195     This is a small helper class to be used with wxCriticalSection objects. 
 197     A wxCriticalSectionLocker enters the critical section in the constructor and 
 198     leaves it in the destructor making it much more difficult to forget to leave 
 199     a critical section (which, in general, will lead to serious and difficult 
 207         // gs_critSect is some (global) critical section guarding access to the 
 209         wxCriticalSectionLocker locker(gs_critSect); 
 226     Without wxCriticalSectionLocker, you would need to remember to manually leave 
 227     the critical section before each @c return. 
 232     @see wxCriticalSection, wxMutexLocker 
 234 class wxCriticalSectionLocker
 
 238         Constructs a wxCriticalSectionLocker object associated with given 
 239         @a criticalsection and enters it. 
 241     wxCriticalSectionLocker(wxCriticalSection
& criticalsection
); 
 244         Destructor leaves the critical section. 
 246     ~wxCriticalSectionLocker(); 
 252     @class wxThreadHelper 
 254     The wxThreadHelper class is a mix-in class that manages a single background 
 255     thread, either detached or joinable (see wxThread for the differences). 
 256     By deriving from wxThreadHelper, a class can implement the thread 
 257     code in its own wxThreadHelper::Entry() method and easily share data and 
 258     synchronization objects between the main thread and the worker thread. 
 260     Doing this prevents the awkward passing of pointers that is needed when the 
 261     original object in the main thread needs to synchronize with its worker thread 
 262     in its own wxThread derived object. 
 264     For example, wxFrame may need to make some calculations in a background thread 
 265     and then display the results of those calculations in the main window. 
 267     Ordinarily, a wxThread derived object would be created with the calculation 
 268     code implemented in wxThread::Entry. To access the inputs to the calculation, 
 269     the frame object would often need to pass a pointer to itself to the thread object. 
 270     Similarly, the frame object would hold a pointer to the thread object. 
 272     Shared data and synchronization objects could be stored in either object 
 273     though the object without the data would have to access the data through 
 275     However with wxThreadHelper the frame object and the thread object are 
 276     treated as the same object. Shared data and synchronization variables are 
 277     stored in the single object, eliminating a layer of indirection and the 
 282         extern const wxEventType wxEVT_COMMAND_MYTHREAD_UPDATE; 
 284         class MyFrame : public wxFrame, public wxThreadHelper 
 290                 // it's better to do any thread cleanup in the OnClose() 
 291                 // event handler, rather than in the destructor. 
 292                 // This is because the event loop for a top-level window is not 
 293                 // active anymore when its destructor is called and if the thread 
 294                 // sends events when ending, they won't be processed unless 
 295                 // you ended the thread from OnClose. 
 296                 // See @ref overview_windowdeletion for more info. 
 300             void DoStartALongTask(); 
 301             void OnThreadUpdate(wxCommandEvent& evt); 
 302             void OnClose(wxCloseEvent& evt); 
 306             virtual wxThread::ExitCode Entry(); 
 308             // the output data of the Entry() routine: 
 310             wxCriticalSection m_dataCS; // protects field above 
 312             DECLARE_EVENT_TABLE() 
 315         DEFINE_EVENT_TYPE(wxEVT_COMMAND_MYTHREAD_UPDATE) 
 316         BEGIN_EVENT_TABLE(MyFrame, wxFrame) 
 317             EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_MYTHREAD_UPDATE, MyFrame::OnThreadUpdate) 
 318             EVT_CLOSE(MyFrame::OnClose) 
 321         void MyFrame::DoStartALongTask() 
 323             // we want to start a long task, but we don't want our GUI to block 
 324             // while it's executed, so we use a thread to do it. 
 325             if (CreateThread(wxTHREAD_JOINABLE) != wxTHREAD_NO_ERROR) 
 327                 wxLogError("Could not create the worker thread!"); 
 332             if (GetThread()->Run() != wxTHREAD_NO_ERROR) 
 334                 wxLogError("Could not run the worker thread!"); 
 339         wxThread::ExitCode MyFrame::Entry() 
 342             // this function gets executed in the secondary thread context! 
 346             // here we do our long task, periodically calling TestDestroy(): 
 347             while (!GetThread()->TestDestroy()) 
 349                 // since this Entry() is implemented in MyFrame context we don't 
 350                 // need any pointer to access the m_data, m_processedData, m_dataCS 
 351                 // variables... very nice! 
 353                 // this is an example of the generic structure of a download thread: 
 355                 download_chunk(buffer, 1024);     // this takes time... 
 358                     // ensure noone reads m_data while we write it 
 359                     wxCriticalSectionLocker lock(m_dataCS); 
 360                     memcpy(m_data+offset, buffer, 1024); 
 365                 // VERY IMPORTANT: do not call any GUI function inside this 
 366                 //                 function; rather use wxQueueEvent(): 
 367                 wxQueueEvent(this, new wxCommandEvent(wxEVT_COMMAND_MYTHREAD_UPDATE)); 
 368                     // we used pointer 'this' assuming it's safe; see OnClose() 
 371             // TestDestroy() returned true (which means the main thread asked us 
 372             // to terminate as soon as possible) or we ended the long task... 
 373             return (wxThread::ExitCode)0; 
 376         void MyFrame::OnClose(wxCloseEvent&) 
 378             // important: before terminating, we _must_ wait for our joinable 
 379             // thread to end, if it's running; in fact it uses variables of this 
 380             // instance and posts events to *this event handler 
 382             if (GetThread() &&      // DoStartALongTask() may have not been called 
 383                 GetThread()->IsRunning()) 
 389         void MyFrame::OnThreadUpdate(wxCommandEvent&evt) 
 391             // ...do something... e.g. m_pGauge->Pulse(); 
 393             // read some parts of m_data just for fun: 
 394             wxCriticalSectionLocker lock(m_dataCS); 
 395             wxPrintf("%c", m_data[100]); 
 408         This constructor simply initializes internal member variables and tells 
 409         wxThreadHelper which type the thread internally managed should be. 
 411     wxThreadHelper(wxThreadKind kind 
= wxTHREAD_JOINABLE
); 
 414         The destructor frees the resources associated with the thread, forcing 
 415         it to terminate (it uses wxThread::Kill function). 
 417         Because of the wxThread::Kill unsafety, you should always wait 
 418         (with wxThread::Wait) for joinable threads to end or call wxThread::Delete 
 419         on detached threads, instead of relying on this destructor for stopping 
 422     virtual ~wxThreadHelper(); 
 425         This is the entry point of the thread. 
 427         This function is pure virtual and must be implemented by any derived class. 
 428         The thread execution will start here. 
 430         You'll typically want your Entry() to look like: 
 432             wxThread::ExitCode Entry() 
 434                 while (!GetThread()->TestDestroy()) 
 436                     // ... do some work ... 
 441                     if (HappenedStoppingError) 
 442                         return (wxThread::ExitCode)1;   // failure 
 445                 return (wxThread::ExitCode)0;           // success 
 449         The returned value is the thread exit code which is only useful for 
 450         joinable threads and is the value returned by @c "GetThread()->Wait()". 
 452         This function is called by wxWidgets itself and should never be called 
 455     virtual ExitCode 
Entry() = 0; 
 458         Creates a new thread of the given @a kind. 
 460         The thread object is created in the suspended state, and you 
 461         should call @ref wxThread::Run "GetThread()->Run()" to start running it. 
 463         You may optionally specify the stack size to be allocated to it (ignored 
 464         on platforms that don't support setting it explicitly, e.g. Unix). 
 466         @return One of the ::wxThreadError enum values. 
 468     wxThreadError 
CreateThread(wxThreadKind kind 
= wxTHREAD_JOINABLE
, 
 469                                unsigned int stackSize 
= 0); 
 472         This is a public function that returns the wxThread object associated with 
 475     wxThread
* GetThread() const; 
 478         Returns the last type of thread given to the CreateThread() function 
 479         or to the constructor. 
 481     wxThreadKind 
GetThreadKind() const; 
 485    Possible critical section types 
 488 enum wxCriticalSectionType
 
 491       /** Recursive critical section under both Windows and Unix */ 
 493     wxCRITSEC_NON_RECURSIVE
 
 494       /** Non-recursive critical section under Unix, recursive under Windows */ 
 498     @class wxCriticalSection 
 500     A critical section object is used for exactly the same purpose as a wxMutex. 
 501     The only difference is that under Windows platform critical sections are only 
 502     visible inside one process, while mutexes may be shared among processes, 
 503     so using critical sections is slightly more efficient. 
 505     The terminology is also slightly different: mutex may be locked (or acquired) 
 506     and unlocked (or released) while critical section is entered and left by the program. 
 508     Finally, you should try to use wxCriticalSectionLocker class whenever 
 509     possible instead of directly using wxCriticalSection for the same reasons 
 510     wxMutexLocker is preferrable to wxMutex - please see wxMutex for an example. 
 515     @see wxThread, wxCondition, wxCriticalSectionLocker 
 517 class wxCriticalSection
 
 521         Default constructor initializes critical section object. 
 522         By default critical sections are recursive under Unix and Windows. 
 524     wxCriticalSection( wxCriticalSectionType critSecType 
= wxCRITSEC_DEFAULT 
); 
 527         Destructor frees the resources. 
 529     ~wxCriticalSection(); 
 532         Enter the critical section (same as locking a mutex). 
 534         There is no error return for this function. 
 535         After entering the critical section protecting some global 
 536         data the thread running in critical section may safely use/modify it. 
 541         Leave the critical section allowing other threads use the global data 
 542         protected by it. There is no error return for this function. 
 548   The possible thread kinds. 
 552     /** Detached thread */ 
 555     /** Joinable thread */ 
 560   The possible thread errors. 
 565     wxTHREAD_NO_ERROR 
= 0, 
 567     /** No resource left to create a new thread. */ 
 568     wxTHREAD_NO_RESOURCE
, 
 570     /** The thread is already running. */ 
 573     /** The thread isn't running. */ 
 574     wxTHREAD_NOT_RUNNING
, 
 576     /** Thread we waited for had to be killed. */ 
 579     /** Some other error */ 
 584    Defines the interval of priority 
 588     WXTHREAD_MIN_PRIORITY      
= 0u, 
 589     WXTHREAD_DEFAULT_PRIORITY  
= 50u, 
 590     WXTHREAD_MAX_PRIORITY      
= 100u 
 597     A thread is basically a path of execution through a program. 
 598     Threads are sometimes called @e light-weight processes, but the fundamental difference 
 599     between threads and processes is that memory spaces of different processes are 
 600     separated while all threads share the same address space. 
 602     While it makes it much easier to share common data between several threads, it 
 603     also makes it much easier to shoot oneself in the foot, so careful use of 
 604     synchronization objects such as mutexes (see wxMutex) or critical sections 
 605     (see wxCriticalSection) is recommended. 
 606     In addition, don't create global thread objects because they allocate memory 
 607     in their constructor, which will cause problems for the memory checking system. 
 610     @section thread_types Types of wxThreads 
 612     There are two types of threads in wxWidgets: @e detached and @e joinable, 
 613     modeled after the the POSIX thread API. This is different from the Win32 API 
 614     where all threads are joinable. 
 616     By default wxThreads in wxWidgets use the @b detached behavior. 
 617     Detached threads delete themselves once they have completed, either by themselves 
 618     when they complete processing or through a call to Delete(), and thus 
 619     @b must be created on the heap (through the new operator, for example). 
 621     Typically you'll want to store the instances of the detached wxThreads you 
 622     allocate, so that you can call functions on them. 
 623     Because of their nature however you'll need to always use a critical section 
 627     // declare a new type of event, to be used by our MyThread class: 
 628     extern const wxEventType wxEVT_COMMAND_MYTHREAD_COMPLETED; 
 629     extern const wxEventType wxEVT_COMMAND_MYTHREAD_UPDATE; 
 632     class MyThread : public wxThread 
 635         MyThread(MyFrame *handler) 
 636             : wxThread(wxTHREAD_DETACHED) 
 637             { m_pHandler = handler } 
 641         virtual ExitCode Entry(); 
 645     class MyFrame : public wxFrame 
 651             // it's better to do any thread cleanup in the OnClose() 
 652             // event handler, rather than in the destructor. 
 653             // This is because the event loop for a top-level window is not 
 654             // active anymore when its destructor is called and if the thread 
 655             // sends events when ending, they won't be processed unless 
 656             // you ended the thread from OnClose. 
 657             // See @ref overview_windowdeletion for more info. 
 660         void DoStartThread(); 
 661         void DoPauseThread(); 
 663         // a resume routine would be nearly identic to DoPauseThread() 
 664         void DoResumeThread() { ... } 
 666         void OnThreadCompletion(wxCommandEvent&); 
 667         void OnClose(wxCloseEvent&); 
 671         wxCriticalSection m_pThreadCS;    // protects the m_pThread pointer 
 673         DECLARE_EVENT_TABLE() 
 676     BEGIN_EVENT_TABLE(MyFrame, wxFrame) 
 677         EVT_CLOSE(MyFrame::OnClose) 
 678         EVT_MENU(Minimal_Start,  MyFrame::DoStartThread) 
 679         EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_MYTHREAD_UPDATE, MyFrame::OnThreadUpdate) 
 680         EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_MYTHREAD_COMPLETED, MyFrame::OnThreadCompletion) 
 683     DEFINE_EVENT_TYPE(wxEVT_COMMAND_MYTHREAD_COMPLETED) 
 684     DEFINE_EVENT_TYPE(wxEVT_COMMAND_MYTHREAD_UPDATE) 
 686     void MyFrame::DoStartThread() 
 688         m_pThread = new MyThread(this); 
 690         if ( m_pThread->Create() != wxTHREAD_NO_ERROR ) 
 692             wxLogError("Can't create the thread!"); 
 698             if (m_pThread->Run() != wxTHREAD_NO_ERROR ) 
 700                 wxLogError("Can't create the thread!"); 
 705             // after the call to wxThread::Run(), the m_pThread pointer is "unsafe": 
 706             // at any moment the thread may cease to exist (because it completes its work). 
 707             // To avoid dangling pointers OnThreadExit() will set m_pThread 
 708             // to NULL when the thread dies. 
 712     wxThread::ExitCode MyThread::Entry() 
 714         while (!TestDestroy()) 
 716             // ... do a bit of work... 
 718             wxQueueEvent(m_pHandler, new wxCommandEvent(wxEVT_COMMAND_MYTHREAD_UPDATE)); 
 721         // signal the event handler that this thread is going to be destroyed 
 722         // NOTE: here we assume that using the m_pHandler pointer is safe, 
 723         //       (in this case this is assured by the MyFrame destructor) 
 724         wxQueueEvent(m_pHandler, new wxCommandEvent(wxEVT_COMMAND_MYTHREAD_COMPLETED)); 
 726         return (wxThread::ExitCode)0;     // success 
 729     MyThread::~MyThread() 
 731         wxCriticalSectionLocker enter(m_pHandler->m_pThreadCS); 
 733         // the thread is being destroyed; make sure not to leave dangling pointers around 
 734         m_pHandler->m_pThread = NULL; 
 737     void MyFrame::OnThreadCompletion(wxCommandEvent&) 
 739         wxMessageOutputDebug().Printf("MYFRAME: MyThread exited!\n"); 
 742     void MyFrame::OnThreadUpdate(wxCommandEvent&) 
 744         wxMessageOutputDebug().Printf("MYFRAME: MyThread update...\n"); 
 747     void MyFrame::DoPauseThread() 
 749         // anytime we access the m_pThread pointer we must ensure that it won't 
 750         // be modified in the meanwhile; since only a single thread may be 
 751         // inside a given critical section at a given time, the following code 
 753         wxCriticalSectionLocker enter(m_pThreadCS); 
 755         if (m_pThread)         // does the thread still exist? 
 757             // without a critical section, once reached this point it may happen 
 758             // that the OS scheduler gives control to the MyThread::Entry() function, 
 759             // which in turn may return (because it completes its work) making 
 760             // invalid the m_pThread pointer 
 762             if (m_pThread->Pause() != wxTHREAD_NO_ERROR ) 
 763                 wxLogError("Can't pause the thread!"); 
 767     void MyFrame::OnClose(wxCloseEvent&) 
 770             wxCriticalSectionLocker enter(m_pThreadCS); 
 772             if (m_pThread)         // does the thread still exist? 
 774                 m_out.Printf("MYFRAME: deleting thread"); 
 776                 if (m_pThread->Delete() != wxTHREAD_NO_ERROR ) 
 777                     wxLogError("Can't delete the thread!"); 
 779         }       // exit from the critical section to give the thread 
 780                 // the possibility to enter its destructor 
 781                 // (which is guarded with m_pThreadCS critical section!) 
 785             { // was the ~MyThread() function executed? 
 786                 wxCriticalSectionLocker enter(m_pThreadCS); 
 787                 if (!m_pThread) break; 
 790             // wait for thread completion 
 791             wxThread::This()->Sleep(1); 
 798     For a more detailed and comprehensive example, see @sample{thread}. 
 799     For a simpler way to share data and synchronization objects between 
 800     the main and the secondary thread see wxThreadHelper. 
 802     Conversely, @b joinable threads do not delete themselves when they are done 
 803     processing and as such are safe to create on the stack. Joinable threads 
 804     also provide the ability for one to get value it returned from Entry() 
 806     You shouldn't hurry to create all the threads joinable, however, because this 
 807     has a disadvantage as well: you @b must Wait() for a joinable thread or the 
 808     system resources used by it will never be freed, and you also must delete the 
 809     corresponding wxThread object yourself if you did not create it on the stack. 
 810     In contrast, detached threads are of the "fire-and-forget" kind: you only have 
 811     to start a detached thread and it will terminate and destroy itself. 
 814     @section thread_deletion wxThread Deletion 
 816     Regardless of whether it has terminated or not, you should call Wait() on a 
 817     @b joinable thread to release its memory, as outlined in @ref thread_types. 
 818     If you created a joinable thread on the heap, remember to delete it manually 
 819     with the @c delete operator or similar means as only detached threads handle 
 820     this type of memory management. 
 822     Since @b detached threads delete themselves when they are finished processing, 
 823     you should take care when calling a routine on one. If you are certain the 
 824     thread is still running and would like to end it, you may call Delete() 
 825     to gracefully end it (which implies that the thread will be deleted after 
 826     that call to Delete()). It should be implied that you should @b never attempt 
 827     to delete a detached thread with the @c delete operator or similar means. 
 829     As mentioned, Wait() or Delete() functions attempt to gracefully terminate a 
 830     joinable and a detached thread, respectively. They do this by waiting until 
 831     the thread in question calls TestDestroy() or ends processing (i.e. returns 
 832     from wxThread::Entry). 
 834     Obviously, if the thread does call TestDestroy() and does not end, the 
 835     thread which called Wait() or Delete() will come to halt. 
 836     This is why it's important to call TestDestroy() in the Entry() routine of 
 837     your threads as often as possible and immediately exit when it returns @true. 
 839     As a last resort you can end the thread immediately through Kill(). It is 
 840     strongly recommended that you do not do this, however, as it does not free 
 841     the resources associated with the object (although the wxThread object of 
 842     detached threads will still be deleted) and could leave the C runtime 
 843     library in an undefined state. 
 846     @section thread_secondary wxWidgets Calls in Secondary Threads 
 848     All threads other than the "main application thread" (the one running 
 849     wxApp::OnInit() or the one your main function runs in, for example) are 
 850     considered "secondary threads". These include all threads created by Create() 
 851     or the corresponding constructors. 
 853     GUI calls, such as those to a wxWindow or wxBitmap are explicitly not safe 
 854     at all in secondary threads and could end your application prematurely. 
 855     This is due to several reasons, including the underlying native API and 
 856     the fact that wxThread does not run a GUI event loop similar to other APIs 
 859     A workaround for some wxWidgets ports is calling wxMutexGUIEnter() 
 860     before any GUI calls and then calling wxMutexGUILeave() afterwords. However, 
 861     the recommended way is to simply process the GUI calls in the main thread 
 862     through an event that is posted by wxQueueEvent(). 
 863     This does not imply that calls to these classes are thread-safe, however, 
 864     as most wxWidgets classes are not thread-safe, including wxString. 
 867     @section thread_poll Don't Poll a wxThread 
 869     A common problem users experience with wxThread is that in their main thread 
 870     they will check the thread every now and then to see if it has ended through 
 871     IsRunning(), only to find that their application has run into problems 
 872     because the thread is using the default behavior (i.e. it's @b detached) and 
 873     has already deleted itself. 
 874     Naturally, they instead attempt to use joinable threads in place of the previous 
 875     behavior. However, polling a wxThread for when it has ended is in general a 
 876     bad idea - in fact calling a routine on any running wxThread should be avoided 
 877     if possible. Instead, find a way to notify yourself when the thread has ended. 
 879     Usually you only need to notify the main thread, in which case you can 
 880     post an event to it via wxQueueEvent(). 
 881     In the case of secondary threads you can call a routine of another class 
 882     when the thread is about to complete processing and/or set the value of 
 883     a variable, possibly using mutexes (see wxMutex) and/or other synchronization 
 889     @see wxThreadHelper, wxMutex, wxCondition, wxCriticalSection, 
 896         The return type for the thread functions. 
 898     typedef void* ExitCode
; 
 901         This constructor creates a new detached (default) or joinable C++ 
 902         thread object. It does not create or start execution of the real thread - 
 903         for this you should use the Create() and Run() methods. 
 905         The possible values for @a kind parameters are: 
 906           - @b wxTHREAD_DETACHED - Creates a detached thread. 
 907           - @b wxTHREAD_JOINABLE - Creates a joinable thread. 
 909     wxThread(wxThreadKind kind 
= wxTHREAD_DETACHED
); 
 912         The destructor frees the resources associated with the thread. 
 913         Notice that you should never delete a detached thread -- you may only call 
 914         Delete() on it or wait until it terminates (and auto destructs) itself. 
 916         Because the detached threads delete themselves, they can only be allocated on the heap. 
 917         Joinable threads should be deleted explicitly. The Delete() and Kill() functions 
 918         will not delete the C++ thread object. It is also safe to allocate them on stack. 
 923         Creates a new thread. 
 925         The thread object is created in the suspended state, and you should call Run() 
 926         to start running it. You may optionally specify the stack size to be allocated 
 927         to it (Ignored on platforms that don't support setting it explicitly, 
 928         eg. Unix system without @c pthread_attr_setstacksize). 
 930         If you do not specify the stack size,the system's default value is used. 
 933             It is a good idea to explicitly specify a value as systems' 
 934             default values vary from just a couple of KB on some systems (BSD and 
 935             OS/2 systems) to one or several MB (Windows, Solaris, Linux). 
 936             So, if you have a thread that requires more than just a few KB of memory, you 
 937             will have mysterious problems on some platforms but not on the common ones. 
 938             On the other hand, just indicating a large stack size by default will give you 
 939             performance issues on those systems with small default stack since those 
 940             typically use fully committed memory for the stack. 
 941             On the contrary, if you use a lot of threads (say several hundred), 
 942             virtual adress space can get tight unless you explicitly specify a 
 943             smaller amount of thread stack space for each thread. 
 946           - @b wxTHREAD_NO_ERROR - No error. 
 947           - @b wxTHREAD_NO_RESOURCE - There were insufficient resources to create the thread. 
 948           - @b wxTHREAD_NO_RUNNING - The thread is already running 
 950     wxThreadError 
Create(unsigned int stackSize 
= 0); 
 953         Calling Delete() gracefully terminates a @b detached thread, either when 
 954         the thread calls TestDestroy() or when it finishes processing. 
 957             This function works on a joinable thread but in that case makes 
 958             the TestDestroy() function of the thread return @true and then 
 959             waits for its completion (i.e. it differs from Wait() because 
 960             it asks the thread to terminate before waiting). 
 962         See @ref thread_deletion for a broader explanation of this routine. 
 964     wxThreadError 
Delete(void** rc 
= NULL
); 
 967         Returns the number of system CPUs or -1 if the value is unknown. 
 969         @see SetConcurrency() 
 971     static int GetCPUCount(); 
 974         Returns the platform specific thread ID of the current thread as a long. 
 975         This can be used to uniquely identify threads, even if they are not wxThreads. 
 977     static unsigned long GetCurrentId(); 
 980         Gets the thread identifier: this is a platform dependent number that uniquely 
 981         identifies the thread throughout the system during its existence 
 982         (i.e. the thread identifiers may be reused). 
 984     wxThreadIdType 
GetId() const; 
 987         Returns the thread kind as it was given in the ctor. 
 991     wxThreadKind 
GetKind() const; 
 994         Gets the priority of the thread, between zero and 100. 
 996         The following priorities are defined: 
 997           - @b WXTHREAD_MIN_PRIORITY: 0 
 998           - @b WXTHREAD_DEFAULT_PRIORITY: 50 
 999           - @b WXTHREAD_MAX_PRIORITY: 100 
1001     unsigned int GetPriority() const; 
1004         Returns @true if the thread is alive (i.e. started and not terminating). 
1006         Note that this function can only safely be used with joinable threads, not 
1007         detached ones as the latter delete themselves and so when the real thread is 
1008         no longer alive, it is not possible to call this function because 
1009         the wxThread object no longer exists. 
1011     bool IsAlive() const; 
1014         Returns @true if the thread is of the detached kind, @false if it is a 
1017     bool IsDetached() const; 
1020         Returns @true if the calling thread is the main application thread. 
1022     static bool IsMain(); 
1025         Returns @true if the thread is paused. 
1027     bool IsPaused() const; 
1030         Returns @true if the thread is running. 
1032         This method may only be safely used for joinable threads, see the remark in 
1035     bool IsRunning() const; 
1038         Immediately terminates the target thread. 
1040         @b "This function is dangerous and should be used with extreme care" 
1041         (and not used at all whenever possible)! The resources allocated to the 
1042         thread will not be freed and the state of the C runtime library may become 
1043         inconsistent. Use Delete() for detached threads or Wait() for joinable 
1046         For detached threads Kill() will also delete the associated C++ object. 
1047         However this will not happen for joinable threads and this means that you will 
1048         still have to delete the wxThread object yourself to avoid memory leaks. 
1050         In neither case OnExit() of the dying thread will be called, so no 
1051         thread-specific cleanup will be performed. 
1052         This function can only be called from another thread context, i.e. a thread 
1055         It is also an error to call this function for a thread which is not running or 
1056         paused (in the latter case, the thread will be resumed first) -- if you do it, 
1057         a @b wxTHREAD_NOT_RUNNING error will be returned. 
1059     wxThreadError 
Kill(); 
1062         Suspends the thread. 
1064         Under some implementations (Win32), the thread is suspended immediately, 
1065         under others it will only be suspended when it calls TestDestroy() for 
1066         the next time (hence, if the thread doesn't call it at all, it won't be 
1069         This function can only be called from another thread context. 
1071     wxThreadError 
Pause(); 
1074         Resumes a thread suspended by the call to Pause(). 
1076         This function can only be called from another thread context. 
1078     wxThreadError 
Resume(); 
1081         Starts the thread execution. Should be called after Create(). 
1083         Note that once you Run() a @b detached thread, @e any function call you do 
1084         on the thread pointer (you must allocate it on the heap) is @e "unsafe"; 
1085         i.e. the thread may have terminated at any moment after Run() and your pointer 
1086         may be dangling. See @ref thread_types for an example of safe manipulation 
1087         of detached threads. 
1089         This function can only be called from another thread context. 
1091     wxThreadError 
Run(); 
1094         Sets the thread concurrency level for this process. 
1096         This is, roughly, the number of threads that the system tries to schedule 
1098         The value of 0 for @a level may be used to set the default one. 
1100         @return @true on success or @false otherwise (for example, if this function is 
1101                 not implemented for this platform -- currently everything except Solaris). 
1103     static bool SetConcurrency(size_t level
); 
1106         Sets the priority of the thread, between 0 and 100. 
1107         It can only be set after calling Create() but before calling Run(). 
1109         The following priorities are defined: 
1110           - @b WXTHREAD_MIN_PRIORITY: 0 
1111           - @b WXTHREAD_DEFAULT_PRIORITY: 50 
1112           - @b WXTHREAD_MAX_PRIORITY: 100 
1114     void SetPriority(unsigned int priority
); 
1117         Pauses the thread execution for the given amount of time. 
1119         This is the same as wxMilliSleep(). 
1121     static void Sleep(unsigned long milliseconds
); 
1124         This function should be called periodically by the thread to ensure that 
1125         calls to Pause() and Delete() will work. 
1127         If it returns @true, the thread should exit as soon as possible. 
1128         Notice that under some platforms (POSIX), implementation of Pause() also 
1129         relies on this function being called, so not calling it would prevent 
1130         both stopping and suspending thread from working. 
1132     virtual bool TestDestroy(); 
1135         Return the thread object for the calling thread. 
1137         @NULL is returned if the calling thread is the main (GUI) thread, but 
1138         IsMain() should be used to test whether the thread is really the main one 
1139         because @NULL may also be returned for the thread not created with wxThread 
1140         class. Generally speaking, the return value for such a thread is undefined. 
1142     static wxThread
* This(); 
1145         Waits for a @b joinable thread to terminate and returns the value the thread 
1146         returned from Entry() or @c "(ExitCode)-1" on error. Notice that, unlike 
1147         Delete(), this function doesn't cancel the thread in any way so the caller 
1148         waits for as long as it takes to the thread to exit. 
1150         You can only Wait() for @b joinable (not detached) threads. 
1152         This function can only be called from another thread context. 
1154         See @ref thread_deletion for a broader explanation of this routine. 
1159         Give the rest of the thread's time-slice to the system allowing the other 
1162         Note that using this function is @b strongly discouraged, since in 
1163         many cases it indicates a design weakness of your threading model 
1164         (as does using Sleep() functions). 
1166         Threads should use the CPU in an efficient manner, i.e. they should 
1167         do their current work efficiently, then as soon as the work is done block 
1168         on a wakeup event (wxCondition, wxMutex, select(), poll(), ...) which will 
1169         get signalled e.g. by other threads or a user device once further thread 
1171         Using Yield() or Sleep() indicates polling-type behaviour, since we're 
1172         fuzzily giving up our timeslice and wait until sometime later we'll get 
1173         reactivated, at which time we realize that there isn't really much to do 
1174         and Yield() again... 
1176         The most critical characteristic of Yield() is that it's operating system 
1177         specific: there may be scheduler changes which cause your thread to not 
1178         wake up relatively soon again, but instead many seconds later, 
1179         causing huge performance issues for your application. 
1182         With a well-behaving, CPU-efficient thread the operating system is likely 
1183         to properly care for its reactivation the moment it needs it, whereas with 
1184         non-deterministic, Yield-using threads all bets are off and the system 
1185         scheduler is free to penalize them drastically</strong>, and this effect 
1186         gets worse with increasing system load due to less free CPU resources available. 
1187         You may refer to various Linux kernel @c sched_yield discussions for more 
1192     static void Yield(); 
1197         This is the entry point of the thread. 
1199         This function is pure virtual and must be implemented by any derived class. 
1200         The thread execution will start here. 
1202         The returned value is the thread exit code which is only useful for 
1203         joinable threads and is the value returned by Wait(). 
1204         This function is called by wxWidgets itself and should never be called 
1207     virtual ExitCode 
Entry() = 0; 
1210         This is a protected function of the wxThread class and thus can only be called 
1211         from a derived class. It also can only be called in the context of this 
1212         thread, i.e. a thread can only exit from itself, not from another thread. 
1214         This function will terminate the OS thread (i.e. stop the associated path of 
1215         execution) and also delete the associated C++ object for detached threads. 
1216         OnExit() will be called just before exiting. 
1218     void Exit(ExitCode exitcode 
= 0); 
1223         Called when the thread exits. 
1225         This function is called in the context of the thread associated with the 
1226         wxThread object, not in the context of the main thread. 
1227         This function will not be called if the thread was @ref Kill() killed. 
1229         This function should never be called directly. 
1231     virtual void OnExit(); 
1235 /** See wxSemaphore. */ 
1238     wxSEMA_NO_ERROR 
= 0, 
1239     wxSEMA_INVALID
,         //!< semaphore hasn't been initialized successfully 
1240     wxSEMA_BUSY
,            //!< returned by TryWait() if Wait() would block 
1241     wxSEMA_TIMEOUT
,         //!< returned by WaitTimeout() 
1242     wxSEMA_OVERFLOW
,        //!< Post() would increase counter past the max 
1249     wxSemaphore is a counter limiting the number of threads concurrently accessing 
1250     a shared resource. This counter is always between 0 and the maximum value 
1251     specified during the semaphore creation. When the counter is strictly greater 
1252     than 0, a call to wxSemaphore::Wait() returns immediately and decrements the 
1253     counter. As soon as it reaches 0, any subsequent calls to wxSemaphore::Wait 
1254     block and only return when the semaphore counter becomes strictly positive 
1255     again as the result of calling wxSemaphore::Post which increments the counter. 
1257     In general, semaphores are useful to restrict access to a shared resource 
1258     which can only be accessed by some fixed number of clients at the same time. 
1259     For example, when modeling a hotel reservation system a semaphore with the counter 
1260     equal to the total number of available rooms could be created. Each time a room 
1261     is reserved, the semaphore should be acquired by calling wxSemaphore::Wait 
1262     and each time a room is freed it should be released by calling wxSemaphore::Post. 
1265     @category{threading} 
1271         Specifying a @a maxcount of 0 actually makes wxSemaphore behave as if 
1272         there is no upper limit. If @a maxcount is 1, the semaphore behaves almost as a 
1273         mutex (but unlike a mutex it can be released by a thread different from the one 
1276         @a initialcount is the initial value of the semaphore which must be between 
1277         0 and @a maxcount (if it is not set to 0). 
1279     wxSemaphore(int initialcount 
= 0, int maxcount 
= 0); 
1282         Destructor is not virtual, don't use this class polymorphically. 
1287         Increments the semaphore count and signals one of the waiting 
1288         threads in an atomic way. Returns @e wxSEMA_OVERFLOW if the count 
1289         would increase the counter past the maximum. 
1292             - wxSEMA_NO_ERROR: There was no error. 
1293             - wxSEMA_INVALID : Semaphore hasn't been initialized successfully. 
1294             - wxSEMA_OVERFLOW: Post() would increase counter past the max. 
1295             - wxSEMA_MISC_ERROR: Miscellaneous error. 
1300         Same as Wait(), but returns immediately. 
1303             - wxSEMA_NO_ERROR: There was no error. 
1304             - wxSEMA_INVALID: Semaphore hasn't been initialized successfully. 
1305             - wxSEMA_BUSY: Returned by TryWait() if Wait() would block, i.e. the count is zero. 
1306             - wxSEMA_MISC_ERROR: Miscellaneous error. 
1308     wxSemaError 
TryWait(); 
1311         Wait indefinitely until the semaphore count becomes strictly positive 
1312         and then decrement it and return. 
1315             - wxSEMA_NO_ERROR: There was no error. 
1316             - wxSEMA_INVALID: Semaphore hasn't been initialized successfully. 
1317             - wxSEMA_MISC_ERROR: Miscellaneous error. 
1322         Same as Wait(), but with a timeout limit. 
1325             - wxSEMA_NO_ERROR: There was no error. 
1326             - wxSEMA_INVALID: Semaphore hasn't been initialized successfully. 
1327             - wxSEMA_TIMEOUT: Timeout occurred without receiving semaphore. 
1328             - wxSEMA_MISC_ERROR: Miscellaneous error. 
1330     wxSemaError 
WaitTimeout(unsigned long timeout_millis
); 
1336     @class wxMutexLocker 
1338     This is a small helper class to be used with wxMutex objects. 
1340     A wxMutexLocker acquires a mutex lock in the constructor and releases 
1341     (or unlocks) the mutex in the destructor making it much more difficult to 
1342     forget to release a mutex (which, in general, will promptly lead to serious 
1343     problems). See wxMutex for an example of wxMutexLocker usage. 
1346     @category{threading} 
1348     @see wxMutex, wxCriticalSectionLocker 
1354         Constructs a wxMutexLocker object associated with mutex and locks it. 
1355         Call IsOk() to check if the mutex was successfully locked. 
1357     wxMutexLocker(wxMutex
& mutex
); 
1360         Destructor releases the mutex if it was successfully acquired in the ctor. 
1365         Returns @true if mutex was acquired in the constructor, @false otherwise. 
1372     The possible wxMutex kinds. 
1376     /** Normal non-recursive mutex: try to always use this one. */ 
1379     /** Recursive mutex: don't use these ones with wxCondition. */ 
1385     The possible wxMutex errors. 
1389     /** The operation completed successfully. */ 
1390     wxMUTEX_NO_ERROR 
= 0, 
1392     /** The mutex hasn't been initialized. */ 
1395      /** The mutex is already locked by the calling thread. */ 
1398     /** The mutex is already locked by another thread. */ 
1401     /** An attempt to unlock a mutex which is not locked. */ 
1404     /** wxMutex::LockTimeout() has timed out. */ 
1407     /** Any other error */ 
1415     A mutex object is a synchronization object whose state is set to signaled when 
1416     it is not owned by any thread, and nonsignaled when it is owned. Its name comes 
1417     from its usefulness in coordinating mutually-exclusive access to a shared 
1418     resource as only one thread at a time can own a mutex object. 
1420     Mutexes may be recursive in the sense that a thread can lock a mutex which it 
1421     had already locked before (instead of dead locking the entire process in this 
1422     situation by starting to wait on a mutex which will never be released while the 
1423     thread is waiting) but using them is not recommended under Unix and they are 
1424     @b not recursive by default. The reason for this is that recursive 
1425     mutexes are not supported by all Unix flavours and, worse, they cannot be used 
1428     For example, when several threads use the data stored in the linked list, 
1429     modifications to the list should only be allowed to one thread at a time 
1430     because during a new node addition the list integrity is temporarily broken 
1431     (this is also called @e program @e invariant). 
1434     // this variable has an "s_" prefix because it is static: seeing an "s_" in 
1435     // a multithreaded program is in general a good sign that you should use a 
1436     // mutex (or a critical section) 
1437     static wxMutex *s_mutexProtectingTheGlobalData; 
1439     // we store some numbers in this global array which is presumably used by 
1440     // several threads simultaneously 
1443     void MyThread::AddNewNode(int num) 
1445         // ensure that no other thread accesses the list 
1446         s_mutexProtectingTheGlobalList->Lock(); 
1450         s_mutexProtectingTheGlobalList->Unlock(); 
1453     // return true if the given number is greater than all array elements 
1454     bool MyThread::IsGreater(int num) 
1456         // before using the list we must acquire the mutex 
1457         wxMutexLocker lock(s_mutexProtectingTheGlobalData); 
1459         size_t count = s_data.Count(); 
1460         for ( size_t n = 0; n < count; n++ ) 
1462             if ( s_data[n] > num ) 
1470     Notice how wxMutexLocker was used in the second function to ensure that the 
1471     mutex is unlocked in any case: whether the function returns true or false 
1472     (because the destructor of the local object @e lock is always called). 
1473     Using this class instead of directly using wxMutex is, in general, safer 
1474     and is even more so if your program uses C++ exceptions. 
1477     @category{threading} 
1479     @see wxThread, wxCondition, wxMutexLocker, wxCriticalSection 
1485         Default constructor. 
1487     wxMutex(wxMutexType type 
= wxMUTEX_DEFAULT
); 
1490         Destroys the wxMutex object. 
1495         Locks the mutex object. 
1496         This is equivalent to LockTimeout() with infinite timeout. 
1498         @return One of: @c wxMUTEX_NO_ERROR, @c wxMUTEX_DEAD_LOCK. 
1500     wxMutexError 
Lock(); 
1503         Try to lock the mutex object during the specified time interval. 
1505         @return One of: @c wxMUTEX_NO_ERROR, @c wxMUTEX_DEAD_LOCK, @c wxMUTEX_TIMEOUT. 
1507     wxMutexError 
LockTimeout(unsigned long msec
); 
1510         Tries to lock the mutex object. If it can't, returns immediately with an error. 
1512         @return One of: @c wxMUTEX_NO_ERROR, @c wxMUTEX_BUSY. 
1514     wxMutexError 
TryLock(); 
1517         Unlocks the mutex object. 
1519         @return One of: @c wxMUTEX_NO_ERROR, @c wxMUTEX_UNLOCKED. 
1521     wxMutexError 
Unlock(); 
1526 // ============================================================================ 
1527 // Global functions/macros 
1528 // ============================================================================ 
1530 /** @ingroup group_funcmacro_thread */ 
1534     This macro declares a (static) critical section object named @a cs if 
1535     @c wxUSE_THREADS is 1 and does nothing if it is 0. 
1537     @header{wx/thread.h} 
1539 #define wxCRIT_SECT_DECLARE(cs) 
1542     This macro declares a critical section object named @a cs if 
1543     @c wxUSE_THREADS is 1 and does nothing if it is 0. As it doesn't include 
1544     the @c static keyword (unlike wxCRIT_SECT_DECLARE()), it can be used to 
1545     declare a class or struct member which explains its name. 
1547     @header{wx/thread.h} 
1549 #define wxCRIT_SECT_DECLARE_MEMBER(cs) 
1552     This macro creates a wxCriticalSectionLocker named @a name and associated 
1553     with the critical section @a cs if @c wxUSE_THREADS is 1 and does nothing 
1556     @header{wx/thread.h} 
1558 #define wxCRIT_SECT_LOCKER(name, cs) 
1561     This macro combines wxCRIT_SECT_DECLARE() and wxCRIT_SECT_LOCKER(): it 
1562     creates a static critical section object and also the lock object 
1563     associated with it. Because of this, it can be only used inside a function, 
1564     not at global scope. For example: 
1569         static int s_counter = 0; 
1571         wxCRITICAL_SECTION(counter); 
1577     Note that this example assumes that the function is called the first time 
1578     from the main thread so that the critical section object is initialized 
1579     correctly by the time other threads start calling it, if this is not the 
1580     case this approach can @b not be used and the critical section must be made 
1583     @header{wx/thread.h} 
1585 #define wxCRITICAL_SECTION(name) 
1588     This macro is equivalent to 
1589     @ref wxCriticalSection::Leave "critical_section.Leave()" if 
1590     @c wxUSE_THREADS is 1 and does nothing if it is 0. 
1592     @header{wx/thread.h} 
1594 #define wxLEAVE_CRIT_SECT(critical_section) 
1597     This macro is equivalent to 
1598     @ref wxCriticalSection::Enter "critical_section.Enter()" if 
1599     @c wxUSE_THREADS is 1 and does nothing if it is 0. 
1601     @header{wx/thread.h} 
1603 #define wxENTER_CRIT_SECT(critical_section) 
1606     Returns @true if this thread is the main one. Always returns @true if 
1607     @c wxUSE_THREADS is 0. 
1609     @header{wx/thread.h} 
1611 bool wxIsMainThread(); 
1614     This function must be called when any thread other than the main GUI thread 
1615     wants to get access to the GUI library. This function will block the 
1616     execution of the calling thread until the main thread (or any other thread 
1617     holding the main GUI lock) leaves the GUI library and no other thread will 
1618     enter the GUI library until the calling thread calls wxMutexGuiLeave(). 
1620     Typically, these functions are used like this: 
1623     void MyThread::Foo(void) 
1625         // before doing any GUI calls we must ensure that 
1626         // this thread is the only one doing it! 
1631         my_window-DrawSomething(); 
1637     This function is only defined on platforms which support preemptive 
1640     @note Under GTK, no creation of top-level windows is allowed in any thread 
1643     @header{wx/thread.h} 
1645 void wxMutexGuiEnter(); 
1648     This function is only defined on platforms which support preemptive 
1651     @see wxMutexGuiEnter() 
1653     @header{wx/thread.h} 
1655 void wxMutexGuiLeave();