]> git.saurik.com Git - wxWidgets.git/blame - docs/latex/wx/thread.tex
fixed status bar positioning to work both with and without sizers (patch 1199639...
[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
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
aea22172 206Note that this function can only safely be used with joinable threads, not
f06afb9c 207detached ones as the latter delete themselves and so when the real thread is
aea22172
JS
208no longer alive, it is not possible to call this function because
209the wxThread object no longer exists.
eaaa6a06 210
9063ea8e
VZ
211\membersection{wxThread::IsDetached}\label{wxthreadisdetached}
212
213\constfunc{bool}{IsDetached}{\void}
214
f06afb9c
VZ
215Returns \true if the thread is of the detached kind, \false if it is a joinable
216one.
217
9063ea8e 218
eaaa6a06
JS
219\membersection{wxThread::IsMain}\label{wxthreadismain}
220
9063ea8e 221\func{static bool}{IsMain}{\void}
eaaa6a06 222
f06afb9c
VZ
223Returns \true if the calling thread is the main application thread.
224
eaaa6a06 225
28d9589a
VZ
226\membersection{wxThread::IsPaused}\label{wxthreadispaused}
227
228\constfunc{bool}{IsPaused}{\void}
229
f06afb9c
VZ
230Returns \true if the thread is paused.
231
28d9589a
VZ
232
233\membersection{wxThread::IsRunning}\label{wxthreadisrunning}
eaaa6a06 234
28d9589a 235\constfunc{bool}{IsRunning}{\void}
eaaa6a06 236
f06afb9c
VZ
237Returns \true if the thread is running.
238
239This method may only be safely used for joinable threads, see the remark in
240\helpref{IsAlive}{wxthreadisalive}.
241
28d9589a
VZ
242
243\membersection{wxThread::Kill}\label{wxthreadkill}
244
245\func{wxThreadError}{Kill}{\void}
246
247Immediately terminates the target thread. {\bf This function is dangerous and should
248be used with extreme care (and not used at all whenever possible)!} The resources
249allocated to the thread will not be freed and the state of the C runtime library
250may become inconsistent. Use \helpref{Delete()}{wxthreaddelete} instead.
eaaa6a06 251
9d9e5e5a
JS
252For detached threads Kill() will also delete the associated C++ object.
253However this will not happen for joinable threads and this means that you will
b18cfdd9
VZ
254still have to delete the wxThread object yourself to avoid memory leaks.
255In neither case \helpref{OnExit}{wxthreadonexit} of the dying thread will be
256called, so no thread-specific cleanup will be performed.
9063ea8e 257
f7aa71fa 258This function can only be called from another thread context, i.e. a thread
9d9e5e5a 259cannot kill itself.
f7aa71fa
VZ
260
261It is also an error to call this function for a thread which is not running or
9505511c 262paused (in the latter case, the thread will be resumed first) -- if you do it,
9d9e5e5a 263a {\tt wxTHREAD\_NOT\_RUNNING} error will be returned.
9063ea8e 264
f06afb9c 265
eaaa6a06
JS
266\membersection{wxThread::OnExit}\label{wxthreadonexit}
267
268\func{void}{OnExit}{\void}
269
f7aa71fa
VZ
270Called when the thread exits. This function is called in the context of the
271thread associated with the wxThread object, not in the context of the main
4958ea8f 272thread. This function will not be called if the thread was
b18cfdd9 273\helpref{killed}{wxthreadkill}.
eaaa6a06 274
9063ea8e
VZ
275This function should never be called directly.
276
f06afb9c 277
9063ea8e
VZ
278\membersection{wxThread::Pause}\label{wxthreadpause}
279
280\func{wxThreadError}{Pause}{\void}
281
282Suspends the thread. Under some implementations (Win32), the thread is
4958ea8f 283suspended immediately, under others it will only be suspended when it calls
9063ea8e
VZ
284\helpref{TestDestroy}{wxthreadtestdestroy} for the next time (hence, if the
285thread doesn't call it at all, it won't be suspended).
286
287This function can only be called from another thread context.
288
f06afb9c 289
e2a6f233
JS
290\membersection{wxThread::Run}\label{wxthreadrun}
291
292\func{wxThreadError}{Run}{\void}
293
4958ea8f 294Starts the thread execution. Should be called after
9063ea8e
VZ
295\helpref{Create}{wxthreadcreate}.
296
297This function can only be called from another thread context.
e2a6f233 298
f06afb9c 299
eaaa6a06
JS
300\membersection{wxThread::SetPriority}\label{wxthreadsetpriority}
301
302\func{void}{SetPriority}{\param{int}{ priority}}
303
7737c485 304Sets the priority of the thread, between $0$ and $100$. It can only be set
4958ea8f 305after calling \helpref{Create()}{wxthreadcreate} but before calling
7737c485 306\helpref{Run()}{wxthreadrun}.
eaaa6a06
JS
307
308The following priorities are already defined:
309
310\twocolwidtha{7cm}
311\begin{twocollist}\itemsep=0pt
e14dccff
KB
312\twocolitem{{\bf WXTHREAD\_MIN\_PRIORITY}}{0}
313\twocolitem{{\bf WXTHREAD\_DEFAULT\_PRIORITY}}{50}
314\twocolitem{{\bf WXTHREAD\_MAX\_PRIORITY}}{100}
eaaa6a06 315\end{twocollist}
28d9589a 316
f06afb9c 317
28d9589a
VZ
318\membersection{wxThread::Sleep}\label{wxthreadsleep}
319
9063ea8e 320\func{static void}{Sleep}{\param{unsigned long }{milliseconds}}
28d9589a
VZ
321
322Pauses the thread execution for the given amount of time.
323
324This function should be used instead of \helpref{wxSleep}{wxsleep} by all worker
9d9e5e5a 325threads (i.e. all except the main one).
28d9589a 326
f06afb9c 327
9063ea8e
VZ
328\membersection{wxThread::Resume}\label{wxthreadresume}
329
330\func{wxThreadError}{Resume}{\void}
331
332Resumes a thread suspended by the call to \helpref{Pause}{wxthreadpause}.
333
334This function can only be called from another thread context.
335
f06afb9c 336
ef8d96c2
VZ
337\membersection{wxThread::SetConcurrency}\label{wxthreadsetconcurrency}
338
339\func{static bool}{SetConcurrency}{\param{size\_t }{level}}
340
341Sets the thread concurrency level for this process. This is, roughly, the
342number of threads that the system tries to schedule to run in parallel.
343The value of $0$ for {\it level} may be used to set the default one.
344
c096f614 345Returns \true on success or false otherwise (for example, if this function is
9505511c 346not implemented for this platform -- currently everything except Solaris).
ef8d96c2 347
f06afb9c 348
9063ea8e
VZ
349\membersection{wxThread::TestDestroy}\label{wxthreadtestdestroy}
350
c096f614 351\func{virtual bool}{TestDestroy}{\void}
9063ea8e 352
9d9e5e5a 353This function should be called periodically by the thread to ensure that calls
9063ea8e 354to \helpref{Pause}{wxthreadpause} and \helpref{Delete}{wxthreaddelete} will
c096f614
VZ
355work. If it returns \true, the thread should exit as soon as possible.
356
357Notice that under some platforms (POSIX), implementation of
358\helpref{Pause}{wxthreadpause} also relies on this function being called, so
359not calling it would prevent both stopping and suspending thread from working.
9063ea8e 360
f06afb9c 361
28d9589a
VZ
362\membersection{wxThread::This}\label{wxthreadthis}
363
9063ea8e 364\func{static wxThread *}{This}{\void}
28d9589a
VZ
365
366Return the thread object for the calling thread. NULL is returned if the calling thread
367is the main (GUI) thread, but \helpref{IsMain}{wxthreadismain} should be used to test
368whether the thread is really the main one because NULL may also be returned for the thread
9d9e5e5a 369not created with wxThread class. Generally speaking, the return value for such a thread
28d9589a
VZ
370is undefined.
371
f06afb9c 372
28d9589a
VZ
373\membersection{wxThread::Yield}\label{wxthreadyield}
374
9063ea8e 375\func{void}{Yield}{\void}
28d9589a
VZ
376
377Give the rest of the thread time slice to the system allowing the other threads to run.
378See also \helpref{Sleep()}{wxthreadsleep}.
e2a6f233 379
f06afb9c 380
9063ea8e
VZ
381\membersection{wxThread::Wait}\label{wxthreadwait}
382
383\constfunc{ExitCode}{Wait}{\void}
384
f6bcfd97 385Waits until the thread terminates and returns its exit code or {\tt (ExitCode)-1} on error.
9063ea8e
VZ
386
387You can only Wait() for joinable (not detached) threads.
388
389This function can only be called from another thread context.
457e6c54 390