mention multi-core systems and wxThread::GetCPUCount
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57448 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		@@ -10,12 +10,12 @@
 | 
			
		||||
 | 
			
		||||
@page overview_thread Multithreading
 | 
			
		||||
 | 
			
		||||
Classes: wxThread, wxMutex, wxCriticalSection, wxCondition
 | 
			
		||||
Classes: wxThread, wxThreadHelper, wxMutex, wxCriticalSection, wxCondition, wxSemaphore
 | 
			
		||||
 | 
			
		||||
wxWidgets provides a complete set of classes encapsulating objects necessary in
 | 
			
		||||
multithreaded (MT) programs: the wxThread class itself and different
 | 
			
		||||
synchronization objects: mutexes (see wxMutex) and critical sections (see
 | 
			
		||||
wxCriticalSection)  with conditions (see wxCondition). The thread API i
 | 
			
		||||
wxCriticalSection)  with conditions (see wxCondition). The thread API in
 | 
			
		||||
wxWidgets resembles to POSIX1.c threads API (a.k.a. pthreads), although several
 | 
			
		||||
functions have different names and some features inspired by Win32 thread API
 | 
			
		||||
are there as well.
 | 
			
		||||
@@ -27,22 +27,24 @@ for large projects. Before starting an MT application (or starting to add MT
 | 
			
		||||
features to an existing one) it is worth asking oneself if there is no easier
 | 
			
		||||
and safer way to implement the same functionality. Of course, in some
 | 
			
		||||
situations threads really make sense (classical example is a server application
 | 
			
		||||
which launches a new thread for each new client), but in others it might be a
 | 
			
		||||
very poor choice (example: launching a separate thread when doing a long
 | 
			
		||||
computation to show a progress dialog). Other implementation choices are
 | 
			
		||||
available: for the progress dialog example it is far better to do the
 | 
			
		||||
calculations in the idle handler (see wxIdleEvent) or even simply do everything
 | 
			
		||||
at once but call wxWindow::Update() periodically to update the screen.
 | 
			
		||||
which launches a new thread for each new client), but in others it might be an
 | 
			
		||||
overkill. On the other hand, the recent evolution of the computer hardware shows
 | 
			
		||||
an important trend towards multi-core systems, which are better exploited using
 | 
			
		||||
multiple threads (e.g. you may want to split a long task among as many threads
 | 
			
		||||
as many CPU (cores) the system reports; see wxThread::GetCPUCount).
 | 
			
		||||
 | 
			
		||||
If you do decide to use threads in your application, it is strongly recommended
 | 
			
		||||
that no more than one thread calls GUI functions. The thread sample shows that
 | 
			
		||||
it @e is possible for many different threads to call GUI functions at once (all
 | 
			
		||||
the threads created in the sample access GUI), but it is a very poor design
 | 
			
		||||
choice for anything except an example. The design which uses one GUI thread and
 | 
			
		||||
several worker threads which communicate with the main one using events is much
 | 
			
		||||
more robust and will undoubtedly save you countless problems (example: under
 | 
			
		||||
Win32 a thread can only access GDI objects such as pens, brushes, c created by
 | 
			
		||||
itself and not by the other threads).
 | 
			
		||||
To implement non-blocking operations without using multiple threads you have
 | 
			
		||||
two other possible implementation choices:
 | 
			
		||||
- using wxIdleEvent (e.g. to perform a long calculation while updating a progress dialog)
 | 
			
		||||
- simply do everything at once but call wxWindow::Update() periodically to update the screen.
 | 
			
		||||
 | 
			
		||||
Even if there are the ::wxMutexGuiEnter and ::wxMutexGuiLeave functions which allows
 | 
			
		||||
to use GUI functions from multiple threads, if you do decide to use threads in your
 | 
			
		||||
application, it is strongly recommended that <b>no more than one calls GUI functions</b>.
 | 
			
		||||
The design which uses one GUI thread and several worker threads which communicate
 | 
			
		||||
with the main one using @b events is much more robust and will undoubtedly save you
 | 
			
		||||
countless problems (example: under Win32 a thread can only access GDI objects such
 | 
			
		||||
as pens, brushes, c created by itself and not by the other threads).
 | 
			
		||||
 | 
			
		||||
For communication between secondary threads and the main thread, you may use
 | 
			
		||||
wxEvtHandler::QueueEvent or its short version ::wxQueueEvent. These functions
 | 
			
		||||
@@ -54,5 +56,8 @@ yourself. In particular, please note that it is not enough to derive
 | 
			
		||||
your class from wxThread and wxEvtHandler to send messages to it: in fact, this
 | 
			
		||||
does not work at all.
 | 
			
		||||
 | 
			
		||||
See also the @sample{thread} for a sample showing some simple interactions
 | 
			
		||||
between the main and secondary threads.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user