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