C++ Qt多线程启动线程错误

C++ Qt多线程启动线程错误,c++,multithreading,qt,qthread,qobject,C++,Multithreading,Qt,Qthread,Qobject,我对Qt多线程有问题。我有一个类,我想作为一个线程 //protdata.cpp class ProtData : public QObject { Q_OBJECT private: QList<ProtDataInputHandler *> _inputs; public: ProtData(); void addInput(); .... }; void ProtData::addInput(QIODevic

我对Qt多线程有问题。我有一个类,我想作为一个线程

//protdata.cpp

class ProtData : public QObject
{
   Q_OBJECT
   private:
      QList<ProtDataInputHandler *> _inputs;
   public:
      ProtData();
      void addInput();
      ....
};

void ProtData::addInput(QIODevice *input, bool network_order)
{
   _inputs.append(new ProtDataInputHandler());
}
在某个时刻,在display.cpp中:

//display.cpp
....
_protdata->addInput();
当我执行addInput方法时,我得到以下错误:

QObject:无法为位于不同线程中的父线程创建子线程。 (父线程是ProtData(0x19bba50),父线程是QThread(0x19b3c18),当前线程是QThread(0x1f08930)

出什么问题了?我还必须将ProtDataInputHandler类移动到newThread?如何


谢谢

只能在procdata.cpp中调用AddInput。 如果将函数定义为插槽,则可以使用信号调用函数:

// display.h

signals :

void addInputSignal();

// display.cpp
QObject::connect(this,  SIGNAL(addInputSignal()), newThread,  SLOT(addInput()));
// ...
emit addInputSignal(); 

// protdata.h

public slots:

void addInput();

尝试将函数标记为可调用的
Q\u

Q_INVOKABLE void addInput();
现在,您可以使用以进行跨线程方法调用。移动到其他线程不会直接影响您进行的调用,但会影响事件和信号调用,例如:

QMetaObject::invokeMethod(_procdata, "addInput", Qt::AutoConnection);

要传递参数,您需要向
QMetaObject::invokeMethod
添加额外的参数,通常使用。

您的问题是代码中的这一行:

_inputs.append(new ProtDataInputHandler());
\u在主线程中输入ProtData时,在主线程中创建了输入

但是,在ProtData QObject子类移动到另一个线程中后,调用addInput()对此进行操作

最好的解决方案是在Qt中使用

基本上,您将在ProtData类中定义一个插槽和一个信号。您将从addInput中发出信号,相应的插槽将由Qt事件循环排队执行

然后,您将在ProtData构造函数中的信号和插槽之间建立连接

将所有这些理论付诸实践,您将修改代码,如下所示:

//protdata.cpp

class ProtData : public QObject
{
   Q_OBJECT
   private:
      QList<ProtDataInputHandler *> _inputs;
   public:
      explicit ProtData(QObject *parent = 0);
      void addInput();
   public signals:
       void appendInput();
   public slots:
       void handleAppendInput();
      ....
};

ProtData::ProtData(QObject *parent)
    : QObject(parent)
{
    ...
    connect(this, SIGNAL(appendInput()), SLOT(handleAppendInput()));
    ...
}

void ProtData::handleAppendInput()
{
   _inputs.append(new ProtDataInputHandler());
}

void ProtData::addInput(QIODevice *input, bool network_order)
{
    emit appendInput();
}
//protdata.cpp
类ProtData:公共QObject
{
Q_对象
私人:
QList_输入;
公众:
显式ProtData(QObject*parent=0);
void addInput();
公共信号:
void appendInput();
公众时段:
void handlappendinput();
....
};
ProtData::ProtData(QObject*父对象)
:QObject(父对象)
{
...
连接(此,信号(appendInput()),插槽(handleAppendInput());
...
}
void ProtData::handleAppendInput()
{
_append(新的ProtDataInputHandler());
}
void ProtData::addInput(QIODevice*输入,布尔网络顺序)
{
发出appendInput();
}
请注意,我还修复了代码中的其他问题:

  • 由于使用C++11等进行统一初始化,我将您的构造函数显式化

  • 您忘记了将QObject父参数分配给基类,因此我也对其进行了修改,同时在未显式指定时使用了默认的“no parent”值

//protdata.cpp

class ProtData : public QObject
{
   Q_OBJECT
   private:
      QList<ProtDataInputHandler *> _inputs;
   public:
      explicit ProtData(QObject *parent = 0);
      void addInput();
   public signals:
       void appendInput();
   public slots:
       void handleAppendInput();
      ....
};

ProtData::ProtData(QObject *parent)
    : QObject(parent)
{
    ...
    connect(this, SIGNAL(appendInput()), SLOT(handleAppendInput()));
    ...
}

void ProtData::handleAppendInput()
{
   _inputs.append(new ProtDataInputHandler());
}

void ProtData::addInput(QIODevice *input, bool network_order)
{
    emit appendInput();
}