+ void Signal()
+ {
+ // set the event to signaled: if a thread is already waiting on it, it
+ // will be woken up, otherwise the event will remain in the signaled
+ // state until someone waits on it. In any case, the system will return
+ // it to a non signalled state afterwards. If multiple threads are
+ // waiting, only one will be woken up.
+ if ( !::SetEvent(m_hEvent) )
+ {
+ wxLogLastError(wxT("SetEvent"));
+ }
+ }
+
+ void Broadcast()
+ {
+ // we need to save the original value as m_nWaiters is goign to be
+ // decreased by the signalled thread resulting in the loop being
+ // executed less times than needed
+ LONG nWaiters = m_nWaiters;
+
+ // this works because all these threads are already waiting and so each
+ // SetEvent() inside Signal() is really a PulseEvent() because the
+ // event state is immediately returned to non-signaled
+ for ( LONG n = 0; n < nWaiters; n++ )
+ {
+ Signal();
+ }
+ }
+