C++ Qt多线程启动线程错误
我对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
//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();
}