Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QThread-使用moveToThread将类成员移动到线程_C++_Multithreading_Qt - Fatal编程技术网

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

C++ QThread-使用moveToThread将类成员移动到线程,c++,multithreading,qt,C++,Multithreading,Qt,我从多线程开始,在将对象移动到QThread时遇到一些问题。我的控制器类实例化工作线程,为工作线程创建必要的线程,并将工作线程移动到新线程。辅助线程启动时,辅助线程上的计算开始。Worker类包含一个虚拟对象,该对象在Worker计算期间使用(functionDummy::doDummyStuff())。一切似乎都很正常,只是doDummyStuff()似乎是在主(控制器)线程而不是工作线程中执行的。这是因为Worker对象(以及虚拟对象)是在主线程中首先创建的吗?有没有办法在辅助线程中移动辅助

我从多线程开始,在将对象移动到QThread时遇到一些问题。我的控制器类实例化工作线程,为工作线程创建必要的线程,并将工作线程移动到新线程。辅助线程启动时,辅助线程上的计算开始。Worker类包含一个虚拟对象,该对象在Worker计算期间使用(function
Dummy::doDummyStuff()
)。一切似乎都很正常,只是
doDummyStuff()
似乎是在主(控制器)线程而不是工作线程中执行的。这是因为Worker对象(以及虚拟对象)是在主线程中首先创建的吗?有没有办法在辅助线程中移动辅助对象的所有类成员

以下是一段代码片段:

控制器.h

class Controller: public QObject
{
    Q_OBJECT

public:
    Controller(std::vector<double> _data, QString _fn);
    void startControl();

private:
    QThread workerThread_;
    Worker worker_;
    PostProcessing postProc_;

};
类控制器:公共QObject
{
Q_对象
公众:
控制器(标准::矢量数据,QString fn);
void startControl();
私人:
QThread worker线程;
工人;
后处理后置程序;
};
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();
}
Controller::Controller(std::vector\u data,QString\u fn):QObject()、workerThread\u()、worker\u(\u data)、postProc\u()
{
QObject::connect(&workerThread_uux,SIGNAL(started()),&worker_x,SLOT(doWork());
QObject::连接(&worker),信号(signalresultraday(double)),&postProc,插槽(update(double));
}
无效控制器::startControl()
{
辅助线程。移动到线程(&workerThread);
workerThread_uz.start();
}
工人

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_;
};
类工作者:公共QObject
{
Q_对象
公众:
工人(标准::向量坐标);
信号:
无效(双);
公众时段:
无效销钉();
私人:
双分辨率;
std::向量坐标;
虚拟dummyCreatedInWorker_2;;
};
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_);

        /* ....*/
    }
}
Worker::Worker(std::vector coord):QObject(),res 0,coord(coord),dummyCreatedInWorker()
{
}
void Worker::doWork()
{

qDebug()您的虚拟类也是从QObject派生的吗

如果将虚拟对象设置为辅助对象的子对象,则在调用moveToThread时会自动移动它

i、 e.将辅助对象传递给虚拟对象的构造函数,如果它没有隐藏默认的qobject构造函数:

Worker::Worker(std::vector<double> _coord): 
  QObject(), res_(0), coord_(_coord), dummyCreatedInWorker_(this)
Worker::Worker(std::vector\u-coord):
QObject(),res_u0,coord_u0(_coord),dummyCreatedInWorker(this)
或者,您可以在工作线程和虚拟线程上调用moveToThread


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

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

但是您不能使用
this->thread()
来检查调用该方法的线程。它返回对象“所在”的线程,即,如果通过信号调用,将调用对象(排队)插槽的线程

使用
QThread::currentThread()
查看调用方法的线程


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

doWork()中的调试是否显示了正确的线程?您直接从doWork()调用doDummyStuff(),因此它将在与doWork()相同的线程中执行,独立于任何QObject thread-affinity。是的,我在doWork()中获得了正确的线程ID。正如BeniBela指出的,我在doDummyStuff()中错误使用了此->线程。使用QThread::currentThread()返回正确的线程ID。感谢您的回答!如果
此->线程()
不等于
QThread::currentThread())
,您最有可能在代码中遇到错误,除非您明确地将
QObject
设计为可从多个线程访问,并且所调用的方法具有访问对象数据的适当同步保护。实际上,使用QThread::currentThread()返回正确的线程ID。感谢您的澄清!
Worker::Worker(std::vector<double> _coord): 
  QObject(), res_(0), coord_(_coord), dummyCreatedInWorker_(this)