git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33428 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			211 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| \section{\class{wxCondition}}\label{wxcondition}
 | |
| 
 | |
| wxCondition variables correspond to pthread conditions or to Win32 event
 | |
| objects. They may be used in a multithreaded application to wait until the
 | |
| given condition becomes true which happens when the condition becomes signaled.
 | |
| 
 | |
| For example, if a worker thread is doing some long task and another thread has
 | |
| to wait until it is finished, the latter thread will wait on the condition
 | |
| object and the worker thread will signal it on exit (this example is not
 | |
| perfect because in this particular case it would be much better to just 
 | |
| \helpref{Wait()}{wxthreadwait} for the worker thread, but if there are several
 | |
| worker threads it already makes much more sense).
 | |
| 
 | |
| Note that a call to \helpref{Signal()}{wxconditionsignal} may happen before the
 | |
| other thread calls \helpref{Wait()}{wxconditionwait} and, just as with the
 | |
| pthread conditions, the signal is then lost and so if you want to be sure that
 | |
| you don't miss it you must keep the mutex associated with the condition
 | |
| initially locked and lock it again before calling 
 | |
| \helpref{Signal()}{wxconditionsignal}. Of course, this means that this call is
 | |
| going to block until \helpref{Wait()}{wxconditionwait} is called by another
 | |
| thread.
 | |
| 
 | |
| \wxheading{Example}
 | |
| 
 | |
| This example shows how a main thread may launch a worker thread which starts
 | |
| running and then waits until the main thread signals it to continue:
 | |
| 
 | |
| \begin{verbatim}
 | |
| class MySignallingThread : public wxThread
 | |
| {
 | |
| public:
 | |
|     MySignallingThread(wxMutex *mutex, wxCondition *condition)
 | |
|     {
 | |
|         m_mutex = mutex;
 | |
|         m_condition = condition;
 | |
| 
 | |
|         Create();
 | |
|     }
 | |
| 
 | |
|     virtual ExitCode Entry()
 | |
|     {
 | |
|         ... do our job ...
 | |
| 
 | |
|         // tell the other(s) thread(s) that we're about to terminate: we must
 | |
|         // lock the mutex first or we might signal the condition before the
 | |
|         // waiting threads start waiting on it!
 | |
|         wxMutexLocker lock(m_mutex);
 | |
|         m_condition.Broadcast(); // same as Signal() here -- one waiter only
 | |
| 
 | |
|         return 0;
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     wxCondition *m_condition;
 | |
|     wxMutex *m_mutex;
 | |
| };
 | |
| 
 | |
| int main()
 | |
| {
 | |
|     wxMutex mutex;
 | |
|     wxCondition condition(mutex);
 | |
| 
 | |
|     // the mutex should be initially locked
 | |
|     mutex.Lock();
 | |
| 
 | |
|     // create and run the thread but notice that it won't be able to
 | |
|     // exit (and signal its exit) before we unlock the mutex below
 | |
|     MySignallingThread *thread = new MySignallingThread(&mutex, &condition);
 | |
| 
 | |
|     thread->Run();
 | |
| 
 | |
|     // wait for the thread termination: Wait() atomically unlocks the mutex
 | |
|     // which allows the thread to continue and starts waiting
 | |
|     condition.Wait();
 | |
| 
 | |
|     // now we can exit
 | |
|     return 0;
 | |
| }
 | |
| \end{verbatim}
 | |
| 
 | |
| Of course, here it would be much better to simply use a joinable thread and
 | |
| call \helpref{wxThread::Wait}{wxthreadwait} on it, but this example does
 | |
| illustrate the importance of properly locking the mutex when using
 | |
| wxCondition.
 | |
| 
 | |
| \wxheading{Constants}
 | |
| 
 | |
| The following return codes are returned by wxCondition member functions:
 | |
| 
 | |
| \begin{verbatim}
 | |
| enum wxCondError
 | |
| {
 | |
|     wxCOND_NO_ERROR = 0,    // successful completion
 | |
|     wxCOND_INVALID,         // object hasn't been initialized successfully
 | |
|     wxCOND_TIMEOUT,         // WaitTimeout() has timed out
 | |
|     wxCOND_MISC_ERROR       // some other error
 | |
| };
 | |
| \end{verbatim}
 | |
| 
 | |
| \wxheading{Derived from}
 | |
| 
 | |
| None.
 | |
| 
 | |
| \wxheading{Include files}
 | |
| 
 | |
| <wx/thread.h>
 | |
| 
 | |
| \wxheading{See also}
 | |
| 
 | |
| \helpref{wxThread}{wxthread}, \helpref{wxMutex}{wxmutex}
 | |
| 
 | |
| \latexignore{\rtfignore{\wxheading{Members}}}
 | |
| 
 | |
| \membersection{wxCondition::wxCondition}\label{wxconditionctor}
 | |
| 
 | |
| \func{}{wxCondition}{\param{wxMutex\& }{mutex}}
 | |
| 
 | |
| Default and only constructor. The {\it mutex} must be locked by the caller
 | |
| before calling \helpref{Wait}{wxconditionwait} function.
 | |
| 
 | |
| Use \helpref{IsOk}{wxconditionisok} to check if the object was successfully
 | |
| initialized.
 | |
| 
 | |
| \membersection{wxCondition::\destruct{wxCondition}}\label{wxconditiondtor}
 | |
| 
 | |
| \func{}{\destruct{wxCondition}}{\void}
 | |
| 
 | |
| Destroys the wxCondition object. The destructor is not virtual so this class
 | |
| should not be used polymorphically.
 | |
| 
 | |
| \membersection{wxCondition::Broadcast}\label{wxconditionbroadcast}
 | |
| 
 | |
| \func{void}{Broadcast}{\void}
 | |
| 
 | |
| Broadcasts to all waiting threads, waking all of them up. Note that this method
 | |
| may be called whether the mutex associated with this condition is locked or
 | |
| not.
 | |
| 
 | |
| \wxheading{See also}
 | |
| 
 | |
| \helpref{wxCondition::Signal}{wxconditionsignal}
 | |
| 
 | |
| \membersection{wxCondition::IsOk}\label{wxconditionisok}
 | |
| 
 | |
| \constfunc{bool}{IsOk}{\void}
 | |
| 
 | |
| Returns {\tt true} if the object had been initialized successfully, {\tt false} 
 | |
| if an error occurred.
 | |
| 
 | |
| \membersection{wxCondition::Signal}\label{wxconditionsignal}
 | |
| 
 | |
| \func{void}{Signal}{\void}
 | |
| 
 | |
| Signals the object waking up at most one thread. If several threads are waiting
 | |
| on the same condition, the exact thread which is woken up is undefined. If no
 | |
| threads are waiting, the signal is lost and the condition would have to be
 | |
| signalled again to wake up any thread which may start waiting on it later.
 | |
| 
 | |
| Note that this method may be called whether the mutex associated with this
 | |
| condition is locked or not.
 | |
| 
 | |
| \wxheading{See also}
 | |
| 
 | |
| \helpref{wxCondition::Broadcast}{wxconditionbroadcast}
 | |
| 
 | |
| \membersection{wxCondition::Wait}\label{wxconditionwait}
 | |
| 
 | |
| \func{wxCondError}{Wait}{\void}
 | |
| 
 | |
| Waits until the condition is signalled.
 | |
| 
 | |
| This method atomically releases the lock on the mutex associated with this
 | |
| condition (this is why it must be locked prior to calling Wait) and puts the
 | |
| thread to sleep until \helpref{Signal}{wxconditionsignal} or 
 | |
| \helpref{Broadcast}{wxconditionbroadcast} is called.
 | |
| 
 | |
| Note that even if \helpref{Signal}{wxconditionsignal} had been called before
 | |
| Wait without waking up any thread, the thread would still wait for another one
 | |
| and so it is important to ensure that the condition will be signalled after
 | |
| Wait or the thread may sleep forever.
 | |
| 
 | |
| \wxheading{Return value}
 | |
| 
 | |
| Returns {\tt wxCOND\_NO\_ERROR} on success, another value if an error occurred.
 | |
| 
 | |
| \wxheading{See also}
 | |
| 
 | |
| \helpref{WaitTimeout}{wxconditionwaittimeout}
 | |
| 
 | |
| 
 | |
| \membersection{wxCondition::WaitTimeout}\label{wxconditionwaittimeout}
 | |
| 
 | |
| \func{wxCondError}{WaitTimeout}{\param{unsigned long}{ milliseconds}}
 | |
| 
 | |
| Waits until the condition is signalled or the timeout has elapsed.
 | |
| 
 | |
| This method is identical to \helpref{Wait}{wxconditionwait} except that it
 | |
| returns, with the return code of {\tt wxCOND\_TIMEOUT} as soon as the given
 | |
| timeout expires.
 | |
| 
 | |
| \wxheading{Parameters}
 | |
| 
 | |
| \docparam{milliseconds}{Timeout in milliseconds}
 | |
| 
 | |
| \wxheading{Return value}
 | |
| 
 | |
| Returns {\tt wxCOND\_NO\_ERROR} if the condition was signalled, 
 | |
| {\tt wxCOND\_TIMEOUT} if the timeout elapsed before this happened or another
 | |
| error code from wxCondError enum.
 | |
| 
 |