我将从多线程开始,但在将对象移动到QThread时遇到了一些问题。我的Controller类实例化Worker,为Worker创建必要的线程并将Worker移动到新线程中。当worker线程启动时,会在worker上进行计算。Worker类包含一个Dummy对象,在worker计算期间使用(函数DoDummyStuff())。一切似乎都运行正常,除了DoDummyStuff()似乎在主(控制器)线程而不是工作线程中执行。这是因为Worker对象(因此是Dummy对象)最初是在主线程中创建的吗?有没有办法将Worker对象的所有类成员移动到worker线程中?
这里是代码片段:
Controller.h
这里是代码片段:
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_;
};
Controller.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_;
};
Worker.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_);
/* ....*/
}
}
Dummy::doDummyStuff
void Dummy::doDummyStuff()
{
qDebug() << "Doing dummy stuff from thread" << this->thread();
for(int ii = 0; ii < 10; ii++)
{
res_ += ii;
}
}
this->thread()
不等于QThread::currentThread()
,那么你很可能在面对代码中的一个错误,除非你已经明确设计了你的QObject
可以从多个线程访问,并且被调用的方法具有适当的同步保护来访问对象的数据。 - Kuba hasn't forgotten Monica