QWaitConditon也是用来同步线程的。从名字来看是等待条件,意思就是线程阻塞在等待条件的地方,直到条件满足才继续执行下去。等待条件的线程可以是一个或者多个。用QWaitCondition的函数表示过程如下:

    1.等待条件的线程调用QWaitCondition::wait()阻塞。

    2.实现条件的线程通过计算完成条件后调用QWaitConditon::wakeOne()或者QWaitCondition::wakeAll()。

    3.当2中调用wake之后,继续执行wait之后的操作。

    其中wakeOne会随机唤醒等待的线程中的一个。wakeAll会唤醒所有的等待线程。

    

    写个例子测试一下:

    1.创建两个线程类Thread和ThreadTwo, Thread用来等待,ThreadTwo来唤醒。两个类的run函数分别如下:

    blob.png


    blob.png

    Thread的run函数功能就是等待被唤醒,然后输出一句话。ThreadTwo的run函数就是每隔2秒唤醒一次。

    2.创建2个Thread类的对象,和1个ThreadTwo的对象,并调用start。然后查看执行情况。

    blob.png

    blob.png

    程序运行后会按上图中箭头所划分,每两秒输出一部分。也就是说ThreadTwo每两秒唤醒了一个Thread的线程。如果ThreadTwo调用的是wakeAll函数那么在输出0时两个线程都被唤醒,运行结果如下:

    blob.png

    

    说明:由于ThreadTwo的run函数中先调用了sleep确保了wake会在Thread的wait之后发生,因此没有使用QMutex来保证他们的执行顺序。