QThread通过插槽创建和交换数据

时间:2014-03-18 17:28:14

标签: c++ multithreading qt

这是我的线程头文件:

#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,其中包含多个intQstringchardoubles,其他嵌入式结构等等。现在它没有& #39;工作,我试着做Q_DECLARE_METATYPE,但没有运气。那我错过了什么?

在主线程中,当我尝试阅读MetaData->DateTime();时,我得到访问被拒绝错误。

1 个答案:

答案 0 :(得分:0)

您应该调用qRegisterMetaType()以使自定义类型可用于非基于模板的函数,例如排队信号和插槽连接。任何具有公共默认构造函数,公共复制构造函数和公共析构函数的类或结构都可以注册。

你应该在你的CreathThreads()函数中调用它:

qRegisterMetaType<MyCustomStruct>("MyCustomStruct");

此外,您应该将MyCustomStruct声明为类,并为其准备公共默认构造函数,公共复制构造函数和公共析构函数。