]> git.saurik.com Git - wxWidgets.git/blame - docs/latex/wx/thread.tex
define _HPUX_SOURCE under HP-UX, otherwise many things are not defined in standard...
[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
6d06e061 65\membersection{wxThread::\destruct{wxThread}}\label{wxthreaddtor}
eaaa6a06
JS
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
94cf5fc7
VZ
87support setting it explicitly, eg. Unix system without
88\texttt{pthread\_attr\_setstacksize}). If you do not specify the stack size,
89the system's default value is used.
8a077f28
SN
90
91{\bf Warning:} It is a good idea to explicitly specify a value as systems'
94cf5fc7
VZ
92default values vary from just a couple of KB on some systems (BSD and
93OS/2 systems) to one or several MB (Windows, Solaris, Linux). So, if you
94have a thread that requires more than just a few KB of memory, you will
95have mysterious problems on some platforms but not on the common ones. On the
96other hand, just indicating a large stack size by default will give you
97performance issues on those systems with small default stack since those
98typically use fully committed memory for the stack. On the contrary, if
99use a lot of threads (say several hundred), virtual adress space can get tight
100unless you explicitly specify a smaller amount of thread stack space for each
8a077f28
SN
101thread.
102
eaaa6a06
JS
103
104\wxheading{Return value}
105
106One of:
107
108\twocolwidtha{7cm}
109\begin{twocollist}\itemsep=0pt
6e6110ee
VZ
110\twocolitem{{\bf wxTHREAD\_NO\_ERROR}}{There was no error.}
111\twocolitem{{\bf wxTHREAD\_NO\_RESOURCE}}{There were insufficient resources to create a new thread.}
112\twocolitem{{\bf wxTHREAD\_RUNNING}}{The thread is already running.}
eaaa6a06
JS
113\end{twocollist}
114
f06afb9c 115
28d9589a 116\membersection{wxThread::Delete}\label{wxthreaddelete}
eaaa6a06 117
43191e0c 118\func{void}{Delete}{\void}
eaaa6a06 119
9063ea8e
VZ
120Calling \helpref{Delete}{wxthreaddelete} is a graceful way to terminate the
121thread. It asks the thread to terminate and, if the thread code is well
c096f614 122written, the thread will terminate after the next call to
9d9e5e5a 123\helpref{TestDestroy}{wxthreadtestdestroy} which should happen quite soon.
9063ea8e 124
4958ea8f 125However, if the thread doesn't call \helpref{TestDestroy}{wxthreadtestdestroy}
9063ea8e 126often enough (or at all), the function will not return immediately, but wait
9d9e5e5a
JS
127until the thread terminates. As it may take a long time, and the message processing
128is not stopped during this function execution, message handlers may be
9063ea8e
VZ
129called from inside it!
130
9505511c
VZ
131Delete() may be called for a thread in any state: running, paused or even not
132yet created. Moreover, it must be called if \helpref{Create}{wxthreadcreate} or
133\helpref{Run}{wxthreadrun} fail in order to free the memory occupied by the
134thread object. However, you should not call Delete() on a detached thread which
135already terminated -- doing so will probably result in a crash because the
136thread object doesn't exist any more.
9fc3ad34 137
9063ea8e
VZ
138For detached threads Delete() will also delete the C++ thread object, but it
139will not do this for joinable ones.
eaaa6a06 140
9063ea8e 141This function can only be called from another thread context.
eaaa6a06 142
f06afb9c 143
43191e0c
VZ
144\membersection{wxThread::Entry}\label{wxthreadentry}
145
9063ea8e 146\func{virtual ExitCode}{Entry}{\void}
43191e0c
VZ
147
148This is the entry point of the thread. This function is pure virtual and must
149be implemented by any derived class. The thread execution will start here.
150
9d9e5e5a 151The returned value is the thread exit code which is only useful for
9063ea8e 152joinable threads and is the value returned by \helpref{Wait}{wxthreadwait}.
43191e0c 153
fc2171bd 154This function is called by wxWidgets itself and should never be called
9063ea8e 155directly.
eaaa6a06 156
f06afb9c 157
f7aa71fa
VZ
158\membersection{wxThread::Exit}\label{wxthreadexit}
159
160\func{void}{Exit}{\param{ExitCode }{exitcode = 0}}
161
9d9e5e5a
JS
162This is a protected function of the wxThread class and thus can only be called
163from a derived class. It also can only be called in the context of this
f7aa71fa
VZ
164thread, i.e. a thread can only exit from itself, not from another thread.
165
166This function will terminate the OS thread (i.e. stop the associated path of
4958ea8f 167execution) and also delete the associated C++ object for detached threads.
f7aa71fa
VZ
168\helpref{wxThread::OnExit}{wxthreadonexit} will be called just before exiting.
169
f06afb9c 170
ef8d96c2
VZ
171\membersection{wxThread::GetCPUCount}\label{wxthreadgetcpucount}
172
173\func{static int}{GetCPUCount}{\void}
174
175Returns the number of system CPUs or -1 if the value is unknown.
176
177\wxheading{See also}
178
179\helpref{SetConcurrency}{wxthreadsetconcurrency}
180
f06afb9c 181
4958ea8f
RD
182\membersection{wxThread::GetCurrentId}\label{wxthreadgetcurrentid}
183
184\func{static unsigned long}{GetCurrentId}{\void}
185
186Returns the platform specific thread ID of the current thread as a
187long. This can be used to uniquely identify threads, even if they are
188not wxThreads.
189
f06afb9c 190
9063ea8e
VZ
191\membersection{wxThread::GetId}\label{wxthreadgetid}
192
193\constfunc{unsigned long}{GetId}{\void}
eaaa6a06 194
9d9e5e5a 195Gets the thread identifier: this is a platform dependent number that uniquely identifies the
28d9589a 196thread throughout the system during its existence (i.e. the thread identifiers may be reused).
eaaa6a06 197
f06afb9c 198
eaaa6a06
JS
199\membersection{wxThread::GetPriority}\label{wxthreadgetpriority}
200
201\constfunc{int}{GetPriority}{\void}
202
203Gets the priority of the thread, between zero and 100.
204
9063ea8e 205The following priorities are defined:
eaaa6a06
JS
206
207\twocolwidtha{7cm}
208\begin{twocollist}\itemsep=0pt
e14dccff
KB
209\twocolitem{{\bf WXTHREAD\_MIN\_PRIORITY}}{0}
210\twocolitem{{\bf WXTHREAD\_DEFAULT\_PRIORITY}}{50}
211\twocolitem{{\bf WXTHREAD\_MAX\_PRIORITY}}{100}
eaaa6a06
JS
212\end{twocollist}
213
f06afb9c 214
eaaa6a06
JS
215\membersection{wxThread::IsAlive}\label{wxthreadisalive}
216
217\constfunc{bool}{IsAlive}{\void}
218
f06afb9c
VZ
219Returns \true if the thread is alive (i.e. started and not terminating).
220
aea22172 221Note that this function can only safely be used with joinable threads, not
f06afb9c 222detached ones as the latter delete themselves and so when the real thread is
aea22172
JS
223no longer alive, it is not possible to call this function because
224the wxThread object no longer exists.
eaaa6a06 225
9063ea8e
VZ
226\membersection{wxThread::IsDetached}\label{wxthreadisdetached}
227
228\constfunc{bool}{IsDetached}{\void}
229
f06afb9c
VZ
230Returns \true if the thread is of the detached kind, \false if it is a joinable
231one.
232
9063ea8e 233
eaaa6a06
JS
234\membersection{wxThread::IsMain}\label{wxthreadismain}
235
9063ea8e 236\func{static bool}{IsMain}{\void}
eaaa6a06 237
f06afb9c
VZ
238Returns \true if the calling thread is the main application thread.
239
eaaa6a06 240
28d9589a
VZ
241\membersection{wxThread::IsPaused}\label{wxthreadispaused}
242
243\constfunc{bool}{IsPaused}{\void}
244
f06afb9c
VZ
245Returns \true if the thread is paused.
246
28d9589a
VZ
247
248\membersection{wxThread::IsRunning}\label{wxthreadisrunning}
eaaa6a06 249
28d9589a 250\constfunc{bool}{IsRunning}{\void}
eaaa6a06 251
f06afb9c
VZ
252Returns \true if the thread is running.
253
254This method may only be safely used for joinable threads, see the remark in
255\helpref{IsAlive}{wxthreadisalive}.
256
28d9589a
VZ
257
258\membersection{wxThread::Kill}\label{wxthreadkill}
259
260\func{wxThreadError}{Kill}{\void}
261
262Immediately terminates the target thread. {\bf This function is dangerous and should
263be used with extreme care (and not used at all whenever possible)!} The resources
264allocated to the thread will not be freed and the state of the C runtime library
265may become inconsistent. Use \helpref{Delete()}{wxthreaddelete} instead.
eaaa6a06 266
9d9e5e5a
JS
267For detached threads Kill() will also delete the associated C++ object.
268However this will not happen for joinable threads and this means that you will
b18cfdd9
VZ
269still have to delete the wxThread object yourself to avoid memory leaks.
270In neither case \helpref{OnExit}{wxthreadonexit} of the dying thread will be
271called, so no thread-specific cleanup will be performed.
9063ea8e 272
f7aa71fa 273This function can only be called from another thread context, i.e. a thread
9d9e5e5a 274cannot kill itself.
f7aa71fa
VZ
275
276It is also an error to call this function for a thread which is not running or
9505511c 277paused (in the latter case, the thread will be resumed first) -- if you do it,
9d9e5e5a 278a {\tt wxTHREAD\_NOT\_RUNNING} error will be returned.
9063ea8e 279
f06afb9c 280
eaaa6a06
JS
281\membersection{wxThread::OnExit}\label{wxthreadonexit}
282
283\func{void}{OnExit}{\void}
284
f7aa71fa
VZ
285Called when the thread exits. This function is called in the context of the
286thread associated with the wxThread object, not in the context of the main
4958ea8f 287thread. This function will not be called if the thread was
b18cfdd9 288\helpref{killed}{wxthreadkill}.
eaaa6a06 289
9063ea8e
VZ
290This function should never be called directly.
291
f06afb9c 292
9063ea8e
VZ
293\membersection{wxThread::Pause}\label{wxthreadpause}
294
295\func{wxThreadError}{Pause}{\void}
296
297Suspends the thread. Under some implementations (Win32), the thread is
4958ea8f 298suspended immediately, under others it will only be suspended when it calls
9063ea8e
VZ
299\helpref{TestDestroy}{wxthreadtestdestroy} for the next time (hence, if the
300thread doesn't call it at all, it won't be suspended).
301
302This function can only be called from another thread context.
303
f06afb9c 304
e2a6f233
JS
305\membersection{wxThread::Run}\label{wxthreadrun}
306
307\func{wxThreadError}{Run}{\void}
308
4958ea8f 309Starts the thread execution. Should be called after
9063ea8e
VZ
310\helpref{Create}{wxthreadcreate}.
311
312This function can only be called from another thread context.
e2a6f233 313
f06afb9c 314
eaaa6a06
JS
315\membersection{wxThread::SetPriority}\label{wxthreadsetpriority}
316
317\func{void}{SetPriority}{\param{int}{ priority}}
318
7737c485 319Sets the priority of the thread, between $0$ and $100$. It can only be set
4958ea8f 320after calling \helpref{Create()}{wxthreadcreate} but before calling
7737c485 321\helpref{Run()}{wxthreadrun}.
eaaa6a06
JS
322
323The following priorities are already defined:
324
325\twocolwidtha{7cm}
326\begin{twocollist}\itemsep=0pt
e14dccff
KB
327\twocolitem{{\bf WXTHREAD\_MIN\_PRIORITY}}{0}
328\twocolitem{{\bf WXTHREAD\_DEFAULT\_PRIORITY}}{50}
329\twocolitem{{\bf WXTHREAD\_MAX\_PRIORITY}}{100}
eaaa6a06 330\end{twocollist}
28d9589a 331
f06afb9c 332
28d9589a
VZ
333\membersection{wxThread::Sleep}\label{wxthreadsleep}
334
9063ea8e 335\func{static void}{Sleep}{\param{unsigned long }{milliseconds}}
28d9589a
VZ
336
337Pauses the thread execution for the given amount of time.
338
339This function should be used instead of \helpref{wxSleep}{wxsleep} by all worker
9d9e5e5a 340threads (i.e. all except the main one).
28d9589a 341
f06afb9c 342
9063ea8e
VZ
343\membersection{wxThread::Resume}\label{wxthreadresume}
344
345\func{wxThreadError}{Resume}{\void}
346
347Resumes a thread suspended by the call to \helpref{Pause}{wxthreadpause}.
348
349This function can only be called from another thread context.
350
f06afb9c 351
ef8d96c2
VZ
352\membersection{wxThread::SetConcurrency}\label{wxthreadsetconcurrency}
353
354\func{static bool}{SetConcurrency}{\param{size\_t }{level}}
355
356Sets the thread concurrency level for this process. This is, roughly, the
357number of threads that the system tries to schedule to run in parallel.
358The value of $0$ for {\it level} may be used to set the default one.
359
c096f614 360Returns \true on success or false otherwise (for example, if this function is
9505511c 361not implemented for this platform -- currently everything except Solaris).
ef8d96c2 362
f06afb9c 363
9063ea8e
VZ
364\membersection{wxThread::TestDestroy}\label{wxthreadtestdestroy}
365
c096f614 366\func{virtual bool}{TestDestroy}{\void}
9063ea8e 367
9d9e5e5a 368This function should be called periodically by the thread to ensure that calls
9063ea8e 369to \helpref{Pause}{wxthreadpause} and \helpref{Delete}{wxthreaddelete} will
c096f614
VZ
370work. If it returns \true, the thread should exit as soon as possible.
371
372Notice that under some platforms (POSIX), implementation of
373\helpref{Pause}{wxthreadpause} also relies on this function being called, so
374not calling it would prevent both stopping and suspending thread from working.
9063ea8e 375
f06afb9c 376
28d9589a
VZ
377\membersection{wxThread::This}\label{wxthreadthis}
378
9063ea8e 379\func{static wxThread *}{This}{\void}
28d9589a
VZ
380
381Return the thread object for the calling thread. NULL is returned if the calling thread
382is the main (GUI) thread, but \helpref{IsMain}{wxthreadismain} should be used to test
383whether the thread is really the main one because NULL may also be returned for the thread
9d9e5e5a 384not created with wxThread class. Generally speaking, the return value for such a thread
28d9589a
VZ
385is undefined.
386
f06afb9c 387
28d9589a
VZ
388\membersection{wxThread::Yield}\label{wxthreadyield}
389
9063ea8e 390\func{void}{Yield}{\void}
28d9589a
VZ
391
392Give the rest of the thread time slice to the system allowing the other threads to run.
393See also \helpref{Sleep()}{wxthreadsleep}.
e2a6f233 394
f06afb9c 395
9063ea8e
VZ
396\membersection{wxThread::Wait}\label{wxthreadwait}
397
398\constfunc{ExitCode}{Wait}{\void}
399
f6bcfd97 400Waits until the thread terminates and returns its exit code or {\tt (ExitCode)-1} on error.
9063ea8e
VZ
401
402You can only Wait() for joinable (not detached) threads.
403
404This function can only be called from another thread context.
457e6c54 405