我是靠谱客的博主 朴实小霸王,最近开发中收集的这篇文章主要介绍记录 Cannot send events to objects owned by a different thread. 两个问题解决方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

---------------------------
Microsoft Visual C++ Runtime Library
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 0x0x13c8988. Receiver '' (of type 'Worker') was created in thread 0x0x1135d14", file kernelqcoreapplication.cpp, line 589


QWaitCondition: Destroyed while threads are still waiting
ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 14107a98. Receiver '' (of type 'QNetworkAccessManager') was created in thread 32a48", file kernelqcoreapplication.cpp, line 505

 

第一个是 我在子线程中  发送 信号A到 mainwindow中  emit signal_Main_Transmit

Main 中使用 一个timer 来设置弹窗停留时间 到时就调用close timerevent 关闭窗口. 

当弹窗显示时间片到时,切换到子线程中, 子线程中会继续发送信号A到 mainwindow中 , timer-> start()

而之前弹窗 timerevent 还没有终止, close timerevent  stop还没有开始 。

mainwindow 事件循环想stop 前一个timer , 但前一个timer 对象早已不是原来的timer了, 就懵了, 停不掉。删不掉。

于是ASSERT了.   

解决方法: 在 调用弹出窗口时 先 stop timerstay event.  去掉了close timerevent.

 

第二个是 debug 应用程序退出是 停掉线程started 函数后,进入线程的析构函数中,析构各种资源,但我奇怪了 m_manager 是线程函数内的局部变量。 不懂qt 什么情况, 

他就报了第二个assert。   

 检查到  线程函数里面 m_manager 链接了信号.  connect(&m_manager, SIGNAL(finished(QNetworkReply*)), this,SLOT(replyFinish(QNetworkReply*)), Qt::QueuedConnection);

不断开的话, 析构就会报错。 所以 disconnect 就派上了用场 .

 

就这两个问题, 用了4个小时全力扑救完成. 说起来都是泪啊,人家debug 一直在提示你 QNetworkAccessManager'有问题,

怎么老想着 postevent 异步事件, 问题都找到根节 然后在找解决方案, 而不要漫无目的的全网搜索解决方案, 跟你的没有一个对路的. 

不写了, 玩会webrtc 去....  开开信心. 

 

 

 
 

最后

以上就是朴实小霸王为你收集整理的记录 Cannot send events to objects owned by a different thread. 两个问题解决方法的全部内容,希望文章能够帮你解决记录 Cannot send events to objects owned by a different thread. 两个问题解决方法所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部