pyqt5 异步请求返回后,ui组件已销毁导致crash的简单解决方法

本文介绍了在PyQT5中,使用异步请求数据时遇到UI组件已被销毁导致程序崩溃的问题。通过在组件销毁时设置标记,并在回调渲染时检查该标记,可以有效防止此类异常。利用sip库可以简化处理代码。
摘要由CSDN通过智能技术生成

pyqt5 异步请求返回后,ui组件已销毁导致crash的简单解决方法

场景

在客户端编写时,涉及到从服务器获取数据, 在主线程同步请求会卡死界面,所以一般都会采用异步的方式,通过背景线程去请求数据,然后通知主线程处理。这种方式有个问题是,很容易导致程序crash。譬如打开一个对话框,开启线程获取数据,由于网络延迟,等到数据返回,回调主线程渲染ui时候,该对话框已经被用户销毁,那这时候,就会抛出:
RuntimeError: wrapped C/C++ object of type XXX has been delete
这种异常,导致整个应用崩溃。

解决思路

要防止这种错误,思路非常简单,就是当数据需要渲染时,发现ui组件已经销毁了,就直接不渲染就完事了。所以最直接的办法,就是在组件销毁的钩子函数中,做个标记。等到异步返回渲染的时候,查看此标记就可以了。但如果手动实现的话,代码较多,不是很方便。
鉴于pyqt是直接包裹的c++对象,因此多方查找下,找到了sip这个包
直接requirements.txt添加或者pip install sip
在异步回调主线程的代码里,如下编写:

def cb(data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值