QT线程交换数据

时间:2014-03-13 22:19:39

标签: c++ multithreading qt

我有一个继承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_METATYPEqRegisterMetaType,但没有工作。

1 个答案:

答案 0 :(得分:2)

如果继承QThread,

从不实施新的广告位。它不会做你想要的。 QThread对象管理一个线程,但它不是一个线程。 您的QThread派生对象存在于主线程中,因此它们的插槽将在主线程中运行(而不是新线程!)

正确的解决方案是:

  1. 不要继承QThread。只需实例化一个QThread对象。
  2. 用于创建工作人员的子类QObject。
  3. 使用QObject::moveToThread()实例化您的工作人员并将其移至新主题。
  4. 启动QThread。
  5. 现在,当您使用信号和插槽时,插槽将以正确的线程运行。
  6. 有关示例,请参阅official QThread documentation