QWaitCondition позволяет потоку сообщать другим потокам о выполнение каких-либо условий. Один или несколько потоков могут блокировать ожидание QWaitCondition для установки условия с помощью wakeOne() или wakeAll().
Рассмотрим небольшой пример который позволяет увидеть механизм ожидания. В данном примере происходит запуск потока и установка его в ожидание. При нажатии на клавишу происходит снятия ожидания в дальнейшего его продолжение работы.
Пример использования QWaitCondition
Полный листинг:
// функция main
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
// основной класс
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
mThread1 = new QThread_1 (&mMutex,&mWait);
// запуск потока в ожидании
mThread1->start();
// по нажатие на кнопку возобновление работы
connect(ui->pushButton,SIGNAL (clicked()),this,SLOT(mutexWake()));
}
// корректное завершение потока если он находится в режиме ожидания
MainWindow::~MainWindow()
{
if (mMutex.tryLock())
{
mMutex.unlock();
}
mThread1 ->deleteLater();
mThread1->wait();
delete mThread1;
delete ui;
}
void MainWindow::mutexWake()
{
mWait.wakeOne(); // возобновление работы потока
}
// описание основного класса
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMutex>
#include "qthread_1.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QMutex mMutex;
QThread_1 * mThread1;
QWaitCondition mWait;
private slots:
void mutexWake();
};
#endif // MAINWINDOW_H
// класс потока
#include "qthread_1.h"
QThread_1::QThread_1(QMutex*m, QWaitCondition * w)
:mutex(m), waitMutex(w)
{
}
void QThread_1::run()
{
qDebug () << "run";
QMutexLocker locker (mutex);
waitMutex->wait(mutex);
qDebug () << "exit";
}
// описание класса потока
#ifndef QTHREAD_1_H
#define QTHREAD_1_H
#include <QObject>
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QDebug.h>
class QThread_1 : public QThread
{
Q_OBJECT
public:
QThread_1 (QMutex*,QWaitCondition*);
private:
QMutex * mutex;
QWaitCondition * waitMutex;
protected:
void run();
};
#endif // QTHREAD_1_H
Поток запустится сразу при начале работы программы
При запуске данного фрагмента сначала выведется:
qDebug () << «run»;
После нажатия на кнопку:
qDebug () << «exit»;
