To pause the workflow, I used the following approach.
Here is part of my GUI.h file:
public:
QAtomicInt check;
private:
int receiver;
QThread *thread;
Worker *worker;
signals:
void begin();
Here is part of my GUI.cpp file:
Widget::Widget(){
receiver = 0;
check = QAtomicInt(1);
pb = new QPushButton("Start");
connect(pb, SIGNAL(clicked()), this, SLOT(start()));
thread = new QThread;
worker = new Worker(this);
worker->moveToThread(thread);
connect(this, SIGNAL(begin()), worker, SLOT(compute()));
connect(worker, SIGNAL(over()), this, SLOT(ovr()));
thread->start();
}
void Widget::start() {
if ( receiver == 0 ) {
pb->setText("Stop");
receiver = 1;
emit begin();
} else if ( receiver == 1 ) {
pb->setText("Start");
receiver = 2;
while ( !(check.testAndSetOrdered(2, 3))) {}
} else {
pb->setText("Stop");
receiver = 1;
while ( !(check.testAndSetOrdered(3, 1))) {}
emit begin();
}
}
Here is my worker.h file:
class Worker : public QObject {
Q_OBJECT
public:
Worker(Widget*);
public slots:
void compute();
signals:
void over();
private:
int limit, counter;
Widget *parent;
};
Here is part of my worker.cpp file:
Worker::Worker(Widget* par) {
parent = par;
counter = 1;
limit = 100000000;
}
void Worker::compute() {
while ( counter < limit ) {
if ( parent->check.testAndSetOrdered(1, 2) ) {
counter += 1;
parent->check.testAndSetOrdered(2, 1);
} else {
return;
}
}
counter = 1;
emit over();
}
- QAtomicInt. , CHECK. , . , CHECK GUI. . , . , ?