並列計算に使えるワーカークラスを考えていました。
オブジェクトを作成した後、ワーカーを別のスレッドに明示的に移動する必要がある状況を回避したかったのです。
Worker worker;
QThread thread;
worker.moveToThread(&thread);
thread.start();
worker.start();
これは私が思いついた解決策です:
ヘッダ:
#include <QObject>
#include <QThread>
class ThreadedWorker : public QObject
{
Q_OBJECT
public:
explicit ThreadedWorker(QObject *parent = 0);
signals:
void finished(ThreadedWorker* worker);
public slots:
void start();
protected:
virtual void run();
QThread workerThread_;
bool isRunning_;
};
ソース:
#include "threadedworker.h"
ThreadedWorker::ThreadedWorker(QObject *parent) : QObject(parent)
{
this->moveToThread(&this->workerThread_);
this->workerThread_.start();
this->isRunning_ = false;
}
void ThreadedWorker::start()
{
if(!this->isRunning_)
{
this->isRunning_ = true;
this->run();
}
}
void ThreadedWorker::run()
{
// HERE GOES THE ACTUAL WORK FOR THE WORKER
//
//
emit this->finished(this); // added to inform a controller object that the worker has finished
}
Zailborg によるコメントの後に更新:
だから今私はただ作成します:
ThreadedWorker worker1;
ThreadedWorker worker2;
外部信号によってスロットを呼び出し、それらstart()
は並行して実行されます。
QThread workerThread_
ただし、私の主な関心事は、クラスのメンバーとして配置しThreadedWorker
、オブジェクトをコンストラクターでそのスレッドに移動することが悪い習慣ではないかどうかです。