可以看到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,这个类都可满足要求。