可以看到Qt提供了一个等待事件发生的类QWaitCondition,当条件满足时可以唤醒其它等待的线程。
写一个类可以在线程间实现同步功能
#ifndef THREADEVENT_H
#define THREADEVENT_H #include <QWaitCondition>
#include <QMutex> class ThreadEvent
{
public:
ThreadEvent(const char* name);
void postMessage();
bool waitMessage(unsigned long time = ULONG_MAX);
private:
QWaitCondition waitConditionM;
QMutex mutexM;
char Name[64];
bool bSatisfiedM;
}; #endif // THREADEVENT_H
#include "ThreadEvent.h" ThreadEvent::ThreadEvent(const char* name)
{
bSatisfiedM = false;
strcpy(Name,name);
} void ThreadEvent::postMessage()
{
qDebug("ThreadEvent: %s\n",Name);
mutexM.lock();
bSatisfiedM = true;
waitConditionM.wakeAll();
mutexM.unlock();
} bool ThreadEvent::waitMessage(unsigned long time)
{
mutexM.lock();
bool rtn = true;
if(bSatisfiedM)
{
rtn = true;
}
else
{
rtn = waitConditionM.wait(&mutexM,time); } bSatisfiedM = false;
mutexM.unlock();
return rtn;
}
用法
ThreadEvent tevent; thread1:
tevent.postMessage(); thread2:
tevent.waitMessage();
不管是thread1先到tevent,还是thread2先到tevent,这个类都可满足要求。