gpt4 book ai didi

c++ - QThread 创建和通过槽交换数据

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:44 26 4
gpt4 key购买 nike

这是我的线程头文件:

#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,它有几个 intQstringchar double ,另一个嵌入的结构等。现在它不起作用,我尝试做Q_DECLARE_METATYPE,但没有成功。那我错过了什么?

在主线程中,当我尝试读取 MetaData->DateTime(); 时出现拒绝访问错误。

最佳答案

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

例如,您应该在 CreathThreads() 函数中调用它:

qRegisterMetaType<MyCustomStruct>("MyCustomStruct");

您还应该将 MyCustomStruct 声明为一个类,并为其准备一个公共(public)默认构造函数、一个公共(public)复制构造函数和一个公共(public)析构函数。

关于c++ - QThread 创建和通过槽交换数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22486688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com