Qt线程:QWaitCondition
一、描述QWaitCondition 线程等待条件。作用是允许一个线程告诉其他线程某种条件已经满足。二、成员函数1、void notify_all()提供此功能是为了兼容 STL。相当于wakeAll()。2、void notify_one()提供此功能是为了兼容 STL。相当于wakeOne()。3、void wakeAll()唤醒所有在等待条件的线程。线程被唤醒的顺序取决于操作系统的调度策略,
一、描述
QWaitCondition 线程等待条件。作用是允许一个线程告诉其他线程某种条件已经满足。
二、成员函数
1、void notify_all()
提供此功能是为了兼容 STL。相当于wakeAll()。
2、void notify_one()
提供此功能是为了兼容 STL。相当于wakeOne()。
3、void wakeAll()
唤醒所有在等待条件的线程。线程被唤醒的顺序取决于操作系统的调度策略,无法控制或预测。
4、void wakeOne()
唤醒一个等待条件的线程。被唤醒的线程取决于操作系统的调度策略,无法控制或预测。如果要唤醒特定线程,解决方案通常是使用不同的等待条件,让不同的线程在不同的条件下等待。
5、bool wait(QMutex *lockedMutex, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
bool wait(QMutex *lockedMutex, unsigned long time)
释放lockedMutex并等待条件。
lockedMutex 最初必须由调用线程锁定。如果lockedMutex 未处于锁定状态,则行为未定义。
如果lockedMutex 是递归互斥锁,则此函数立即返回。锁定的互斥锁将被解锁,调用线程将被阻塞,直到满足以下任一条件:
- 另一个线程使用wakeOne() 或wakeAll() 发出信号。在这种情况下,此函数将返回 true。
- 到了截止日期给出的截止日期。如果deadline 是QDeadlineTimer::Forever,那么等待将永远不会超时(必须发出事件信号)。 如果等待超时,此函数将返回 false。
锁定的互斥体将返回到相同的锁定状态。 提供此函数是为了允许从锁定状态到等待状态的原子转换。
例:
int i = 0;
QWaitCondition waitCondition;
class myThread1 : public QThread
{
public:
myThread1(){}
protected:
void run()override
{
for(;i <= 2000000000;++i)
{
}
qDebug()<<"满足条件了,唤醒线程myThread2";
waitCondition.wakeOne();
}
};
class myThread2 : public QThread
{
public:
myThread2(){}
protected:
void run()override
{
QMutex mutex;
mutex.lock();
if(i < 2000000000)
{
qDebug()<<"未满足条件,先停下来 i = "<<i<<" "<<QDateTime::currentDateTime();
waitCondition.wait(&mutex);
}
mutex.unlock();
qDebug()<<"满足条件了,继续执行 i = "<<i<<" "<<QDateTime::currentDateTime();
}
};
int main(int argc, char *argv[])
{
myThread1 t1;
myThread2 t2;
t1.start();
t2.start();
t1.wait();
t2.wait();
}
6、bool wait(QReadWriteLock *lockedReadWriteLock, QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
重载函数。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)