私はマルチスレッドから始めていますが、オブジェクトを QThread に移動する際に問題があります。私の Controller クラスは Worker をインスタンス化し、Worker に必要なスレッドを作成し、Worker を新しいスレッドに移動します。ワーカー スレッドが開始されると、ワーカーでの計算が開始されます。Worker クラスには、ワーカーの計算中に使用される Dummy オブジェクトが含まれています (関数Dummy::doDummyStuff()
)。doDummyStuff()
ワーカー スレッドではなくメイン (コントローラー) スレッドで実行されているように見えることを除いて、すべて正常に動作しているようです。これは、ワーカー オブジェクト (したがってダミー オブジェクト) がメイン スレッドで最初に作成されたためですか? ワーカー スレッドで Worker オブジェクトのすべてのクラス メンバーを移動する方法はありますか?
コード スニペットは次のとおりです。
Controller.h
class Controller: public QObject
{
Q_OBJECT
public:
Controller(std::vector<double> _data, QString _fn);
void startControl();
private:
QThread workerThread_;
Worker worker_;
PostProcessing postProc_;
};
コントローラ.cpp
Controller::Controller(std::vector<double> _data, QString _fn): QObject(), workerThread_(), worker_(_data), postProc_()
{
QObject::connect(&workerThread_, SIGNAL(started()), &worker_, SLOT(doWork()));
QObject::connect(&worker_, SIGNAL(signalResultReady(double)), &postProc_, SLOT(update(double)));
}
void Controller::startControl()
{
worker_.moveToThread(&workerThread_);
workerThread_.start();
}
Worker.h
class Worker: public QObject
{
Q_OBJECT
public:
Worker(std::vector<double> _coord);
signals:
void signalResultReady(double);
public slots:
void doWork();
private:
double res_;
std::vector<double> coord_;
Dummy dummyCreatedInWorker_;
};
ワーカー.cpp
Worker::Worker(std::vector<double> _coord): QObject(), res_(0), coord_(_coord), dummyCreatedInWorker_()
{
}
void Worker::doWork()
{
qDebug() << "Worker thread ID" << this->thread();
for(unsigned int ii = 0; ii < coord_.size(); ii++)
{
res_ += coord_[ii];
dummyCreatedInWorker_.doDummyStuff();
emit signalResultReady(res_);
/* ....*/
}
}
ダミー::doDummyStuff
void Dummy::doDummyStuff()
{
qDebug() << "Doing dummy stuff from thread" << this->thread();
for(int ii = 0; ii < 10; ii++)
{
res_ += ii;
}
}