gpt4 book ai didi

c++ - QThread - 使用 moveToThread 将类成员移动到线程

转载 作者:太空狗 更新时间:2023-10-29 21:22:54 24 4
gpt4 key购买 nike

我刚开始使用多线程,在将对象移动到 QThread 时遇到了一些麻烦。我的 Controller 类实例化了 Worker,为 Worker 创建了必要的线程并将 Worker 移动到新线程。当工作线程启动时,工作线程上的计算开始。 Worker 类包含一个 Dummy 对象,该对象在 worker 计算期间使用(函数 Dummy::doDummyStuff())。一切似乎都工作正常,除了 doDummyStuff() 似乎是在主( Controller )线程而不是工作线程中执行的。这是因为 Worker 对象(以及 Dummy 对象)首先在主线程中创建吗?有没有办法在工作线程中移动 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_;

};

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;
}
}

最佳答案

你的虚拟类也是从 QObject 派生的?

如果您将 dummy 设置为 worker 的子级,那么当您调用 moveToThread 时它将自动移动。

即将 worker 传递给 dummy 的构造函数,如果它没有隐藏默认的 qobject 构造函数:

Worker::Worker(std::vector<double> _coord): 
QObject(), res_(0), coord_(_coord), dummyCreatedInWorker_(this)

或者,您可以调用 worker 上的 moveToThread dummy。


但是,即使不做任何更改,Dummy::doDummyStuff() 也会在工作线程中被调用。

调用任何东西都不会改变线程,只会发出(排队的)信号。

但是您不能使用this->thread() 来检查在哪个线程中调用了该方法。它返回对象“存在于其中”的线程,即如果对象的槽被信号调用,则将在其中调用对象的(排队的)槽的线程。

而是使用QThread::currentThread() 来查看调用方法的线程。

可以在任何线程中调用任何对象的任何方法,完全独立于对象与线程之间的关联

关于c++ - QThread - 使用 moveToThread 将类成员移动到线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19621240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com