threading.Event()
通过threading.Event()可以创建一个事件管理标志event = threading.Event();
该标志(event)默认为False,event对象主要有以下4种方法可以调用:
event.wait(timeout=None)
:调用该方法的线程会被阻塞,如果设置了timeout参数,超出后,线程会停止阻塞继续执行;
event.set()
:将event的标志设置为True,调用wait方法的所有线程将被唤醒;
event.clear()
:将event的标志设置为False,调用wait方法的所有线程将被阻塞;
event.isSet()
:判断event的标志是否为True。
Qt实现threading.Event()相类似方法
使用QWaitCondition类实现。
QWaitCondition类
QWaitCondition类是一个线程同步器件,用于等待特定条件(条件变量)的发生。线程可以在条件变量上等待,直到其他线程发出一个信号通知条件变量的状态发生了变化。其提供如下一些函数:
wait(QMutex *lockedMutex)
:解锁互斥量lockedMutex,并阻塞等待唤醒条件,被唤醒后锁定lockedMutex并退出函数。
wakeAll()
:唤醒所有处于等待状态的线程,线程唤醒的顺序不确定,由操作系统的调度策略决定。
wakeOne
:唤醒一个处于等待状态的线程,唤醒哪个线程不确定,由操作系统的调度策略决定。
实现threading.Event()
定义Event类
event.h
#ifndef EVENT_H
#define EVENT_H
#include <QWaitCondition>
#include <QMutex>
class Event
{
private:
QMutex mutex;
QWaitCondition condition;
bool state;
public:
Event(bool initialState=false);
void set();
void clear();
bool wait(int timeout=-1);
bool isSet();
};
#endif // EVENT_H
event.cpp
#include"event.h"
Event::Event(bool initialState)
{
state = initialState;
}
void Event::set()
{
mutex.lock();
state = true;
condition.wakeAll();
mutex.unlock();
}
void Event::clear()
{
mutex.lock();
state = false;
mutex.unlock();
}
bool Event::wait(int timeout)
{
bool result = false;
mutex.lock();
if(!state)
{
if(timeout < 0)
{
condition.wait(&mutex);
result = true;
}
else
{
result = condition.wait(&mutex, timeout);
}
}
else
{
result = true;
}
mutex.unlock;
return result;
}
bool Event::isSet()
{
return state;
}