这是我的线程头文件:
#include <QThread>
#include <QString>
#include "typedef.h"
class ImgProcess : public QThread
{
Q_OBJECT
public:
explicit ImgProcess(QObject *parent = 0);
void run();
bool Stop;
ImageInfo iInf;
signals:
void valueChanged(int);
void NewFile(QString FileName, MyCustomStruct* MetaData);
public slots:
private slots:
};
Q_DECLARE_METATYPE(MyCustomStruct);
这是我用来从这个类创建10个线程的代码(头文件上面是ImgProcess.h
)
void CreateThreads()
{
qRegisterMetaType<MyCustomStruct>("MyCustomStruct");
QList<QThread*> ThreadList;
for (int i =0;i<10;i++)
{
QThread* thread = new QThread;
ImgProcess *PrcThread = new ImgProcess(this);
PrcThread->moveToThread(thread);
connect(PrcThread, SIGNAL(valueChanged(int)),this, SLOT(onValueChanged(int)));
connect(PrcThread, SIGNAL(NewFile(QString,MyCustomStruct*)),this, SLOT(NewFile(QString,MyCustomStruct*)));
PrcThread->start();
ThreadList.push_back(thread);
}
}
valuChanged
信号/插槽效果很好,我能够将线程中的整数发送给线程创建者类,我甚至尝试QString
并且我能够发送QString
从线程到创作者。
现在我想要交换MyCustomStruct
,其中包含多个int
,Qstring
,char
,doubles
,其他嵌入式结构等等。现在它没有& #39;工作,我试着做Q_DECLARE_METATYPE
,但没有运气。那我错过了什么?
在主线程中,当我尝试阅读MetaData->DateTime();
时,我得到访问被拒绝错误。
答案 0 :(得分:0)
您应该调用qRegisterMetaType()以使自定义类型可用于非基于模板的函数,例如排队信号和插槽连接。任何具有公共默认构造函数,公共复制构造函数和公共析构函数的类或结构都可以注册。
你应该在你的CreathThreads()函数中调用它:
qRegisterMetaType<MyCustomStruct>("MyCustomStruct");
此外,您应该将MyCustomStruct声明为类,并为其准备公共默认构造函数,公共复制构造函数和公共析构函数。