我是靠谱客的博主 要减肥钻石,最近开发中收集的这篇文章主要介绍QT中出现"无法将事件发送到其他线程拥有的对象"断言提示的原因,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

QT中回收指针是通过给构造函数传递父类(就是管理这个类实例的类实例)的this指针进行,比如A类实例中有B类实例,B类实例中有C类实例,C通过this指针被B管理,在B被回收之前,C先被回收;同理,A被回收时,B先被回收。它们被回收的顺序就是C-B-A。

 

但是,如果A、B、C是不同的线程,通过this进行回收就会出现以下提示:

ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 0x0x186bae20. Receiver '' (of type 'Stc12Serial') was created in thread 0x0x95fdf8", file kernelqcoreapplication.cpp, line 589

为了解决这个问题,QT中还有通过delete关键字手动回收指针。具体方法是:

在B类析构函数中添加delete C的语句,在A类析构函数中添加delete B的语句。这样就不会有上述问题的报告了。

按照上面的方法,可以解决该问题,可是又有问题引入。

QObject: Cannot create children for a parent that is in a different thread.

(Parent is Stc12Serial(0x1a35c9d0), parent's thread is QThread(0xaeae20), current thread is QThread(0x95fdf8)

问题分析:

关于QCoreApplication::postEvent和QCoreApplication::sendEvent

  1. postEvent: 可以给别的线程发送事件。事件会在目的对象所属的线程中运行。这是一个异步接口。
  2. sendEvent: 仅用于同一个线程之间发送事件。目的对象必须与当前线程一样。这是一个同步接口。假如发送给属于另一个线程的对象,会报错:ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread a51f48. Receiver '' (of type 'MyObject') was created in thread a3bf18", file kernelqcoreapplication.cpp, line 539

线程中类的指针在线程quit后会被线程回收,不需要手动delete,否则也会出现上面错误。

如果C类是在B类中创建实例,B类在A类中创建实例,那么信号与槽的连接只能是A与B连接,在A中调用到C对象函数时,需要通过A的信号与B的槽连接,在B槽函数中使用C对象。不能直接在A类中调用C类的函数,否则会出现上面的问题提示。

最后

以上就是要减肥钻石为你收集整理的QT中出现"无法将事件发送到其他线程拥有的对象"断言提示的原因的全部内容,希望文章能够帮你解决QT中出现"无法将事件发送到其他线程拥有的对象"断言提示的原因所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部