#ifndef TESTTHREAD_H
#define TESTTHREAD_H
#include <QThread>
#include <QWaitCondition>
#include <QMutex>
class TestThread : public QThread
{
Q_OBJECT
public:
explicit TestThread(QObject *parent = 0);
private:
void run();
private:
QWaitCondition continueTestingCond;
QMutex testLock;
bool continueTesting;
signals:
void isContinuTesting(QMutex *testLock, QWaitCondition *waitCTN);
public:
void continuTest(bool go);
};
#endif // TESTTHREAD_H
#include <QDebug>
#include "testthread.h"
TestThread::TestThread(QObject *parent):QThread(parent)
{
continueTesting = false;
}
void TestThread::run()
{
testLock.lock();
emit isContinuTesting(&testLock, &continueTestingCond);
continueTestingCond.wait(&testLock);
testLock.unlock();
if(continueTesting)
{
qDebug() << "contine";
}
else
{
qDebug() << "break";
}
}
void TestThread::continuTest(bool go)
{
continueTesting = go;
}
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "testthread.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
private:
TestThread *testThread;
private slots:
void processTestState(QMutex *testLock, QWaitCondition *waitCTN);
void on_pushButton_released();
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include "dialog.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
testThread = new TestThread(this);
connect(testThread, SIGNAL(isContinuTesting(QMutex*,QWaitCondition *)),
this,SLOT(processTestState(QMutex*,QWaitCondition *)));
}
Widget::~Widget()
{
delete ui;
}
void Widget::processTestState(QMutex *testLock, QWaitCondition *waitCTN)
{
testLock->lock();
Dialog dialog;
if(dialog.exec() == QDialog::Accepted)
{
testThread->continuTest(true);
}
else
{
testThread->continuTest(false);
}
testLock->unlock();
testLock->lock();
waitCTN->wakeOne();
testLock->unlock();
}
void Widget::on_pushButton_released()
{
testThread->start();
}