Возможно ли для работника остановить свой собственный поток с подключением сигнал / слот в Qt?

Я пытаюсь реализовать потоковый рабочий для параллельных вычислений. Проблема, с которой я столкнулся, заключается в том, что quit() слот thread не срабатывает, поэтому приложения ждут при while(thread->isRunning()), Можно ли остановить thread от worker используя сигнальную связь между ними?
Вот мой код:

main.cpp:

#include <QCoreApplication>
#include "workermanager.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
WorkerManager workerManager;
workerManager.process();
return a.exec();
}

worker.h:

#include <QObject>
#include <QDebug>

class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = 0) :
QObject(parent){}

signals:
void processingFinished();

public slots:
void process()
{
qDebug() << "processing";
emit this->processingFinished();
}
};

workermanager.h:

#include "worker.h"#include <QThread>

class WorkerManager : public QObject
{
Q_OBJECT
public:
explicit WorkerManager(QObject *parent = 0) :
QObject(parent){}

void process()
{
QThread* thread = new QThread;
Worker* worker = new Worker;

connect(thread,SIGNAL(started()),worker,SLOT(process()));
connect(worker,SIGNAL(processingFinished()),thread,SLOT(quit()));

worker->moveToThread(thread);
thread->start();
qDebug() << "thread started";
while(thread->isRunning())
{
}
qDebug() << "thread finished";

//further operations - e.g. data collection from workers etc.

}
};

0

Решение

То, что цикл while блокирует ваш поток и мешает ему обрабатывать любые сигналы, если вы действительно хотите дождаться завершения потока, вам нужно запустить цикл обработки событий.

Попробуйте это вместо этого:

void process()
{
QThread* thread = new QThread;
Worker* worker = new Worker;

connect(thread,SIGNAL(started()),worker,SLOT(process()));
connect(worker,SIGNAL(processingFinished()),thread,SLOT(quit()));

worker->moveToThread(thread);

QEventLoop loop;
connect(thread, &QThread::finished, &loop, &QEventLoop::quit);
qDebug() << "thread started";
thread->start();
loop.exec();
qDebug() << "thread finished";

//further operations - e.g. data collection from workers etc.

}

Но я должен признать, что на самом деле не вижу смысла этого кода. Если вам нужно дождаться завершения задачи, чтобы продолжить работу, вы можете запустить ее напрямую.
Там, по крайней мере, ваша программа сможет обрабатывать другие вещи (если они есть) за это время.

0

Другие решения


По вопросам рекламы [email protected]