我有一个继承 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_METATYPE
和 qRegisterMetaType
,但没有用。
最佳答案
如果继承 QThread,
永远不要实现新槽。它不会做你想做的。一个 QThread 对象管理一个线程,但它不是一个线程。 您的 QThread 派生对象存在于主线程中,因此它们的槽将在主线程中运行(而不是新线程!)
正确的解决方法是:
- 不要继承 QThread。只需实例化一个 QThread 对象。
- 子类化 QObject 以创建一个 worker。
- 使用
QObject::moveToThread()
实例化您的 worker 并将其移动到新线程。 - 启动 QThread。
- 现在,当您使用信号和槽时,槽将在正确的线程中运行。
参见 official QThread documentation举个例子。
关于c++ - QT线程交换数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22392203/