Я пытаюсь реализовать поточный рабочий для параллельного вычисления. Проблема, с которой я столкнулся, заключается в том, что слот quit()
thread
не запускается, поэтому приложения ждут while(thread->isRunning())
. Можно ли остановить thread
от worker
, используя соединение сигналов между ними? Вот мой код:Возможно ли, чтобы работник остановил свою собственную нить с сигналом/слотом в Qt?
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.
}
};
Непонятно, как вы ожидаете, что это сработает, учитывая, что ваша текущая реализация является синхронной. Вы намерены, чтобы «WorkerManager» жил на своем собственном потоке? Если это так, то он может просто запустить цикл событий для этого потока. – sjdowling
'worker' живет в рабочем потоке, а' thread' живет в основном потоке, поэтому сигнал 'processingFinished' будет отправлен через по очереди соединение. Следовательно, слот 'quit' будет вызываться контуром события основного потока, но цикл событий не обрабатывается в вашем цикле' while'. – Oktalist