public:
CThread(void) :
m_bStop(false),
- m_bRunning(false) {}
+ m_bRunning(false),
+ m_bStopped(false) {}
virtual ~CThread(void)
{
if (thread)
{
- CLockObject lock(thread->m_threadMutex);
- thread->m_bRunning = true;
- lock.Unlock();
- thread->m_threadCondition.Broadcast();
+ {
+ CLockObject lock(thread->m_threadMutex);
+ thread->m_bRunning = true;
+ thread->m_bStopped = false;
+ thread->m_threadCondition.Broadcast();
+ }
retVal = thread->Process();
- lock.Lock();
- thread->m_bRunning = false;
- lock.Unlock();
- thread->m_threadCondition.Broadcast();
+ {
+ CLockObject lock(thread->m_threadMutex);
+ thread->m_bRunning = false;
+ thread->m_bStopped = true;
+ thread->m_threadCondition.Broadcast();
+ }
}
return retVal;
if (ThreadsCreate(m_thread, CThread::ThreadHandler, ((void*)static_cast<CThread *>(this))))
{
if (bWait)
- m_threadCondition.Wait(m_threadMutex);
+ m_threadCondition.Wait(m_threadMutex, m_bRunning);
bReturn = true;
}
}
CLockObject lock(m_threadMutex);
bRunning = IsRunning();
m_bStop = true;
- m_threadCondition.Broadcast();
}
if (bRunning && bWaitForExit)
virtual bool Sleep(uint32_t iTimeout)
{
CLockObject lock(m_threadMutex);
- return m_bStop ? false : m_threadCondition.Wait(m_threadMutex, iTimeout);
+ return m_bStop ? false : m_threadCondition.Wait(m_threadMutex, m_bStopped, iTimeout);
}
virtual void *Process(void) = 0;
void SetRunning(bool bSetTo);
private:
- bool m_bStop;
- bool m_bRunning;
- CCondition m_threadCondition;
- CMutex m_threadMutex;
- thread_t m_thread;
+ bool m_bStop;
+ bool m_bRunning;
+ bool m_bStopped;
+ CCondition<bool &> m_threadCondition;
+ CMutex m_threadMutex;
+ thread_t m_thread;
};
};