0

並列計算用にスレッド化されたワーカーを実装しようとしています。私が遭遇した問題は、 の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.

    }
};
4

1 に答える 1