c++ - QT线程交换数据

标签 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) 我所做的(没有元数据)是对的还是那个也是错的?

2) 解决方案是什么?

附言我一起尝试了 Q_DECLARE_METATYPEqRegisterMetaType,但没有用。

最佳答案

如果继承 QThread,

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

正确的解决方法是:

  1. 不要继承 QThread。只需实例化一个 QThread 对象。
  2. 子类化 QObject 以创建一个 worker。
  3. 使用 QObject::moveToThread() 实例化您的 worker 并将其移动到新线程。
  4. 启动 QThread。
  5. 现在,当您使用信号和槽时,槽将在正确的线程中运行。

参见 official QThread documentation举个例子。

关于c++ - QT线程交换数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22392203/

相关文章:

java - 单个 Thread.interrupt() 中断不止一次

c - 杀死GDB中的特定线程

c++ - 关闭 Qt 中的所有小部件,除了一些

c++ - if constexpr(condition) 作为编译时条件

c++ - 使用 C++ 的编程原理和实践第 4 章练习,第 7 步

c++ - 内存栅栏是否涉及内核

C++,同一类中的类实例,类中的父/子结构

c++ - librdkafka 程序无错退出

python - 使用 PyQt/QtWebkit 抓取多个链接

python - QT将灰度图像绘制成伪彩色(PyQt)