]> git.saurik.com Git - wxWidgets.git/blame - docs/latex/wx/thread.tex
First step in background erase optimization
[wxWidgets.git] / docs / latex / wx / thread.tex
CommitLineData
eaaa6a06
JS
1\section{\class{wxThread}}\label{wxthread}
2
9d9e5e5a 3A thread is basically a path of execution through a program. Threads are
631f1bfe 4sometimes called {\it light-weight processes}, but the fundamental difference
6e6110ee
VZ
5between threads and processes is that memory spaces of different processes are
6separated while all threads share the same address space. While it makes it
87b6002d 7much easier to share common data between several threads, it also makes it much
631f1bfe 8easier to shoot oneself in the foot, so careful use of synchronization objects
28d9589a 9such as \helpref{mutexes}{wxmutex} and/or \helpref{critical sections}{wxcriticalsection} is recommended.
eaaa6a06 10
fc2171bd 11There are two types of threads in wxWidgets: {\it detached} and {\it joinable}
9d9e5e5a
JS
12ones, just as in the POSIX thread API (but unlike Win32 threads where all threads
13are joinable). The difference between the two is that only joinable threads
9505511c 14can return a return code -- this is returned by the Wait() function. Detached
9d9e5e5a 15threads (the default type) cannot be waited for.
9fc3ad34
VZ
16
17You shouldn't hurry to create all the threads joinable, however, because this
9d9e5e5a
JS
18has a disadvantage as well: you {\bf must} Wait() for a joinable thread or the
19system resources used by it will never be freed, and you also must delete the
20corresponding wxThread object yourself. In contrast, detached threads are of the
9fc3ad34
VZ
21"fire-and-forget" kind: you only have to start a detached thread and it will
22terminate and destroy itself.
23
24This means, of course, that all detached threads {\bf must} be created on the
9d9e5e5a 25heap because the thread will call {\tt delete this;} upon termination. Joinable
520d1936
VZ
26threads may be created on the stack although more usually they will be created
27on the heap as well. Don't create global thread objects because they allocate
28memory in their constructor, which will cause problems for the memory checking
ed446867
VZ
29system. Finally, another consequence of the handling of the above is that you
30should never delete a detached thread yourself, as this will be done by the
31thread itself when it terminates.
9fc3ad34 32
eaaa6a06
JS
33\wxheading{Derived from}
34
35None.
36
954b8ae6
JS
37\wxheading{Include files}
38
39<wx/thread.h>
40
eaaa6a06
JS
41\wxheading{See also}
42
e2a6f233 43\helpref{wxMutex}{wxmutex}, \helpref{wxCondition}{wxcondition}, \helpref{wxCriticalSection}{wxcriticalsection}
eaaa6a06
JS
44
45\latexignore{\rtfignore{\wxheading{Members}}}
46
f06afb9c 47
28d9589a 48\membersection{wxThread::wxThread}\label{wxthreadctor}
eaaa6a06 49
f6bcfd97 50\func{}{wxThread}{\param{wxThreadKind }{kind = wxTHREAD\_DETACHED}}
eaaa6a06 51
9d9e5e5a 52This constructor creates a new detached (default) or joinable C++ thread object. It
9505511c 53does not create or start execution of the real thread -- for this you should
9d9e5e5a 54use the \helpref{Create}{wxthreadcreate} and \helpref{Run}{wxthreadrun} methods.
eaaa6a06 55
f6bcfd97 56The possible values for {\it kind} parameters are:
9d9e5e5a 57
f6bcfd97
BP
58\twocolwidtha{7cm}
59\begin{twocollist}\itemsep=0pt
60\twocolitem{{\bf wxTHREAD\_DETACHED}}{Create a detached thread.}
61\twocolitem{{\bf wxTHREAD\_JOINABLE}}{Create a joinable thread}
62\end{twocollist}
63
f06afb9c 64
eaaa6a06
JS
65\membersection{wxThread::\destruct{wxThread}}
66
67\func{}{\destruct{wxThread}}{\void}
68
9d9e5e5a 69The destructor frees the resources associated with the thread. Notice that you
9505511c 70should never delete a detached thread -- you may only call
9063ea8e
VZ
71\helpref{Delete}{wxthreaddelete} on it or wait until it terminates (and auto
72destructs) itself. Because the detached threads delete themselves, they can
73only be allocated on the heap.
74
9d9e5e5a 75Joinable threads should be deleted explicitly. The \helpref{Delete}{wxthreaddelete} and \helpref{Kill}{wxthreadkill} functions
9063ea8e
VZ
76will not delete the C++ thread object. It is also safe to allocate them on
77stack.
eaaa6a06 78
f06afb9c 79
eaaa6a06
JS
80\membersection{wxThread::Create}\label{wxthreadcreate}
81
6fe73788 82\func{wxThreadError}{Create}{\param{unsigned int }{stackSize = 0}}
eaaa6a06 83
9d9e5e5a 84Creates a new thread. The thread object is created in the suspended state, and you
6fe73788
RL
85should call \helpref{Run}{wxthreadrun} to start running it. You may optionally
86specify the stack size to be allocated to it (Ignored on platforms that don't
87support setting it explicitly, eg. Unix).
eaaa6a06
JS
88
89\wxheading{Return value}
90
91One of:
92
93\twocolwidtha{7cm}
94\begin{twocollist}\itemsep=0pt
6e6110ee
VZ
95\twocolitem{{\bf wxTHREAD\_NO\_ERROR}}{There was no error.}
96\twocolitem{{\bf wxTHREAD\_NO\_RESOURCE}}{There were insufficient resources to create a new thread.}
97\twocolitem{{\bf wxTHREAD\_RUNNING}}{The thread is already running.}
eaaa6a06
JS
98\end{twocollist}
99
f06afb9c 100
28d9589a 101\membersection{wxThread::Delete}\label{wxthreaddelete}
eaaa6a06 102
43191e0c 103\func{void}{Delete}{\void}
eaaa6a06 104
9063ea8e
VZ
105Calling \helpref{Delete}{wxthreaddelete} is a graceful way to terminate the
106thread. It asks the thread to terminate and, if the thread code is well
c096f614 107written, the thread will terminate after the next call to
9d9e5e5a 108\helpref{TestDestroy}{wxthreadtestdestroy} which should happen quite soon.
9063ea8e 109
4958ea8f 110However, if the thread doesn't call \helpref{TestDestroy}{wxthreadtestdestroy}
9063ea8e 111often enough (or at all), the function will not return immediately, but wait
9d9e5e5a
JS
112until the thread terminates. As it may take a long time, and the message processing
113is not stopped during this function execution, message handlers may be
9063ea8e
VZ
114called from inside it!
115
9505511c
VZ
116Delete() may be called for a thread in any state: running, paused or even not
117yet created. Moreover, it must be called if \helpref{Create}{wxthreadcreate} or
118\helpref{Run}{wxthreadrun} fail in order to free the memory occupied by the
119thread object. However, you should not call Delete() on a detached thread which
120already terminated -- doing so will probably result in a crash because the
121thread object doesn't exist any more.
9fc3ad34 122
9063ea8e
VZ
123For detached threads Delete() will also delete the C++ thread object, but it
124will not do this for joinable ones.
eaaa6a06 125
9063ea8e 126This function can only be called from another thread context.
eaaa6a06 127
f06afb9c 128
43191e0c
VZ
129\membersection{wxThread::Entry}\label{wxthreadentry}
130
9063ea8e 131\func{virtual ExitCode}{Entry}{\void}
43191e0c
VZ
132
133This is the entry point of the thread. This function is pure virtual and must
134be implemented by any derived class. The thread execution will start here.
135
9d9e5e5a 136The returned value is the thread exit code which is only useful for
9063ea8e 137joinable threads and is the value returned by \helpref{Wait}{wxthreadwait}.
43191e0c 138
fc2171bd 139This function is called by wxWidgets itself and should never be called
9063ea8e 140directly.
eaaa6a06 141
f06afb9c 142
f7aa71fa
VZ
143\membersection{wxThread::Exit}\label{wxthreadexit}
144
145\func{void}{Exit}{\param{ExitCode }{exitcode = 0}}
146
9d9e5e5a
JS
147This is a protected function of the wxThread class and thus can only be called
148from a derived class. It also can only be called in the context of this
f7aa71fa
VZ
149thread, i.e. a thread can only exit from itself, not from another thread.
150
151This function will terminate the OS thread (i.e. stop the associated path of
4958ea8f 152execution) and also delete the associated C++ object for detached threads.
f7aa71fa
VZ
153\helpref{wxThread::OnExit}{wxthreadonexit} will be called just before exiting.
154
f06afb9c 155
ef8d96c2
VZ
156\membersection{wxThread::GetCPUCount}\label{wxthreadgetcpucount}
157
158\func{static int}{GetCPUCount}{\void}
159
160Returns the number of system CPUs or -1 if the value is unknown.
161
162\wxheading{See also}
163
164\helpref{SetConcurrency}{wxthreadsetconcurrency}
165
f06afb9c 166
4958ea8f
RD
167\membersection{wxThread::GetCurrentId}\label{wxthreadgetcurrentid}
168
169\func{static unsigned long}{GetCurrentId}{\void}
170
171Returns the platform specific thread ID of the current thread as a
172long. This can be used to uniquely identify threads, even if they are
173not wxThreads.
174
f06afb9c 175
9063ea8e
VZ
176\membersection{wxThread::GetId}\label{wxthreadgetid}
177
178\constfunc{unsigned long}{GetId}{\void}
eaaa6a06 179
9d9e5e5a 180Gets the thread identifier: this is a platform dependent number that uniquely identifies the
28d9589a 181thread throughout the system during its existence (i.e. the thread identifiers may be reused).
eaaa6a06 182
f06afb9c 183
eaaa6a06
JS
184\membersection{wxThread::GetPriority}\label{wxthreadgetpriority}
185
186\constfunc{int}{GetPriority}{\void}
187
188Gets the priority of the thread, between zero and 100.
189
9063ea8e 190The following priorities are defined:
eaaa6a06
JS
191
192\twocolwidtha{7cm}
193\begin{twocollist}\itemsep=0pt
e14dccff
KB
194\twocolitem{{\bf WXTHREAD\_MIN\_PRIORITY}}{0}
195\twocolitem{{\bf WXTHREAD\_DEFAULT\_PRIORITY}}{50}
196\twocolitem{{\bf WXTHREAD\_MAX\_PRIORITY}}{100}
eaaa6a06
JS
197\end{twocollist}
198
f06afb9c 199
eaaa6a06
JS
200\membersection{wxThread::IsAlive}\label{wxthreadisalive}
201
202\constfunc{bool}{IsAlive}{\void}
203
f06afb9c
VZ
204Returns \true if the thread is alive (i.e. started and not terminating).
205
206Note that this function can only be saely used with joinable threads, not
207detached ones as the latter delete themselves and so when the real thread is
208not alive any longer it is not possible to call this function neither because
209the wxThread object doesn't exist any more as well.
210
eaaa6a06 211
9063ea8e
VZ
212\membersection{wxThread::IsDetached}\label{wxthreadisdetached}
213
214\constfunc{bool}{IsDetached}{\void}
215
f06afb9c
VZ
216Returns \true if the thread is of the detached kind, \false if it is a joinable
217one.
218
9063ea8e 219
eaaa6a06
JS
220\membersection{wxThread::IsMain}\label{wxthreadismain}
221
9063ea8e 222\func{static bool}{IsMain}{\void}
eaaa6a06 223
f06afb9c
VZ
224Returns \true if the calling thread is the main application thread.
225
eaaa6a06 226
28d9589a
VZ
227\membersection{wxThread::IsPaused}\label{wxthreadispaused}
228
229\constfunc{bool}{IsPaused}{\void}
230
f06afb9c
VZ
231Returns \true if the thread is paused.
232
28d9589a
VZ
233
234\membersection{wxThread::IsRunning}\label{wxthreadisrunning}
eaaa6a06 235
28d9589a 236\constfunc{bool}{IsRunning}{\void}
eaaa6a06 237
f06afb9c
VZ
238Returns \true if the thread is running.
239
240This method may only be safely used for joinable threads, see the remark in
241\helpref{IsAlive}{wxthreadisalive}.
242
28d9589a
VZ
243
244\membersection{wxThread::Kill}\label{wxthreadkill}
245
246\func{wxThreadError}{Kill}{\void}
247
248Immediately terminates the target thread. {\bf This function is dangerous and should
249be used with extreme care (and not used at all whenever possible)!} The resources
250allocated to the thread will not be freed and the state of the C runtime library
251may become inconsistent. Use \helpref{Delete()}{wxthreaddelete} instead.
eaaa6a06 252
9d9e5e5a
JS
253For detached threads Kill() will also delete the associated C++ object.
254However this will not happen for joinable threads and this means that you will
b18cfdd9
VZ
255still have to delete the wxThread object yourself to avoid memory leaks.
256In neither case \helpref{OnExit}{wxthreadonexit} of the dying thread will be
257called, so no thread-specific cleanup will be performed.
9063ea8e 258
f7aa71fa 259This function can only be called from another thread context, i.e. a thread
9d9e5e5a 260cannot kill itself.
f7aa71fa
VZ
261
262It is also an error to call this function for a thread which is not running or
9505511c 263paused (in the latter case, the thread will be resumed first) -- if you do it,
9d9e5e5a 264a {\tt wxTHREAD\_NOT\_RUNNING} error will be returned.
9063ea8e 265
f06afb9c 266
eaaa6a06
JS
267\membersection{wxThread::OnExit}\label{wxthreadonexit}
268
269\func{void}{OnExit}{\void}
270
f7aa71fa
VZ
271Called when the thread exits. This function is called in the context of the
272thread associated with the wxThread object, not in the context of the main
4958ea8f 273thread. This function will not be called if the thread was
b18cfdd9 274\helpref{killed}{wxthreadkill}.
eaaa6a06 275
9063ea8e
VZ
276This function should never be called directly.
277
f06afb9c 278
9063ea8e
VZ
279\membersection{wxThread::Pause}\label{wxthreadpause}
280
281\func{wxThreadError}{Pause}{\void}
282
283Suspends the thread. Under some implementations (Win32), the thread is
4958ea8f 284suspended immediately, under others it will only be suspended when it calls
9063ea8e
VZ
285\helpref{TestDestroy}{wxthreadtestdestroy} for the next time (hence, if the
286thread doesn't call it at all, it won't be suspended).
287
288This function can only be called from another thread context.
289
f06afb9c 290
e2a6f233
JS
291\membersection{wxThread::Run}\label{wxthreadrun}
292
293\func{wxThreadError}{Run}{\void}
294
4958ea8f 295Starts the thread execution. Should be called after
9063ea8e
VZ
296\helpref{Create}{wxthreadcreate}.
297
298This function can only be called from another thread context.
e2a6f233 299
f06afb9c 300
eaaa6a06
JS
301\membersection{wxThread::SetPriority}\label{wxthreadsetpriority}
302
303\func{void}{SetPriority}{\param{int}{ priority}}
304
7737c485 305Sets the priority of the thread, between $0$ and $100$. It can only be set
4958ea8f 306after calling \helpref{Create()}{wxthreadcreate} but before calling
7737c485 307\helpref{Run()}{wxthreadrun}.
eaaa6a06
JS
308
309The following priorities are already defined:
310
311\twocolwidtha{7cm}
312\begin{twocollist}\itemsep=0pt
e14dccff
KB
313\twocolitem{{\bf WXTHREAD\_MIN\_PRIORITY}}{0}
314\twocolitem{{\bf WXTHREAD\_DEFAULT\_PRIORITY}}{50}
315\twocolitem{{\bf WXTHREAD\_MAX\_PRIORITY}}{100}
eaaa6a06 316\end{twocollist}
28d9589a 317
f06afb9c 318
28d9589a
VZ
319\membersection{wxThread::Sleep}\label{wxthreadsleep}
320
9063ea8e 321\func{static void}{Sleep}{\param{unsigned long }{milliseconds}}
28d9589a
VZ
322
323Pauses the thread execution for the given amount of time.
324
325This function should be used instead of \helpref{wxSleep}{wxsleep} by all worker
9d9e5e5a 326threads (i.e. all except the main one).
28d9589a 327
f06afb9c 328
9063ea8e
VZ
329\membersection{wxThread::Resume}\label{wxthreadresume}
330
331\func{wxThreadError}{Resume}{\void}
332
333Resumes a thread suspended by the call to \helpref{Pause}{wxthreadpause}.
334
335This function can only be called from another thread context.
336
f06afb9c 337
ef8d96c2
VZ
338\membersection{wxThread::SetConcurrency}\label{wxthreadsetconcurrency}
339
340\func{static bool}{SetConcurrency}{\param{size\_t }{level}}
341
342Sets the thread concurrency level for this process. This is, roughly, the
343number of threads that the system tries to schedule to run in parallel.
344The value of $0$ for {\it level} may be used to set the default one.
345
c096f614 346Returns \true on success or false otherwise (for example, if this function is
9505511c 347not implemented for this platform -- currently everything except Solaris).
ef8d96c2 348
f06afb9c 349
9063ea8e
VZ
350\membersection{wxThread::TestDestroy}\label{wxthreadtestdestroy}
351
c096f614 352\func{virtual bool}{TestDestroy}{\void}
9063ea8e 353
9d9e5e5a 354This function should be called periodically by the thread to ensure that calls
9063ea8e 355to \helpref{Pause}{wxthreadpause} and \helpref{Delete}{wxthreaddelete} will
c096f614
VZ
356work. If it returns \true, the thread should exit as soon as possible.
357
358Notice that under some platforms (POSIX), implementation of
359\helpref{Pause}{wxthreadpause} also relies on this function being called, so
360not calling it would prevent both stopping and suspending thread from working.
9063ea8e 361
f06afb9c 362
28d9589a
VZ
363\membersection{wxThread::This}\label{wxthreadthis}
364
9063ea8e 365\func{static wxThread *}{This}{\void}
28d9589a
VZ
366
367Return the thread object for the calling thread. NULL is returned if the calling thread
368is the main (GUI) thread, but \helpref{IsMain}{wxthreadismain} should be used to test
369whether the thread is really the main one because NULL may also be returned for the thread
9d9e5e5a 370not created with wxThread class. Generally speaking, the return value for such a thread
28d9589a
VZ
371is undefined.
372
f06afb9c 373
28d9589a
VZ
374\membersection{wxThread::Yield}\label{wxthreadyield}
375
9063ea8e 376\func{void}{Yield}{\void}
28d9589a
VZ
377
378Give the rest of the thread time slice to the system allowing the other threads to run.
379See also \helpref{Sleep()}{wxthreadsleep}.
e2a6f233 380
f06afb9c 381
9063ea8e
VZ
382\membersection{wxThread::Wait}\label{wxthreadwait}
383
384\constfunc{ExitCode}{Wait}{\void}
385
f6bcfd97 386Waits until the thread terminates and returns its exit code or {\tt (ExitCode)-1} on error.
9063ea8e
VZ
387
388You can only Wait() for joinable (not detached) threads.
389
390This function can only be called from another thread context.
457e6c54 391