我有一个继承QThread
的类,我创建了这个类的几个实例,它使我的程序成为多线程。
我还使用插槽/信号在线程和主线程(线程创建者)之间交换数据。
我有这个:
void FoundNewFile(QString SourceDrive, QString Path, QString FileName);
这很完美。
现在我决定也分享文件的元数据,为此,我有自己的大型结构,所以我做了:
void FoundNewFile(QString SourceDrive, QString Path, QString FileName, MetaData* meta);
此MetaData
相当大,包含不同的数据类型并具有多个链接的结构。
现在,当我尝试做的时,在主线程中发出信号时:
meta->datetime->creationhour;
我收到拒绝访问错误。
1)我在做什么(没有MetaData)是对的还是那个也错了?
2)解决方案是什么?
P.S。我一起尝试了Q_DECLARE_METATYPE
和qRegisterMetaType
,但没有工作。
答案 0 :(得分:2)
从不实施新的广告位。它不会做你想要的。 QThread对象管理一个线程,但它不是一个线程。 您的QThread派生对象存在于主线程中,因此它们的插槽将在主线程中运行(而不是新线程!)
正确的解决方案是:
QObject::moveToThread()
实例化您的工作人员并将其移至新主题。有关示例,请参阅official QThread documentation。