【PyQt错误集 - 1】:PyQt调用多线程导致窗口异常退出的问题分析(进程已结束,退出代码 -1073741819 (0xC0000005))

本文主要是介绍【PyQt错误集 - 1】:PyQt调用多线程导致窗口异常退出的问题分析(进程已结束,退出代码 -1073741819 (0xC0000005)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 问题分析
  • 解决方法

问题分析

运行以下程序:

def run_thread_WTD(self):threading.Thread(target=self.WTD).start()def WTD(self):word_path = self.word_path.text()# textBrowser为多行文本框QTextEditself.pycorrectorKenlm(word_path, textBrowser)# kenlm
def pycorrectorKenlm(self, word_path, textBrowser):error_counter_kenlm = 0try:m = Corrector(language_model_path='zh_giga.no_cna_cmn.prune01244.klm',custom_confusion_path_or_dict='my_custom_confusion.txt')#./ means current Pathexcept:textBrowser.append("Error")doc = docx.Document(word_path)for para in doc.paragraphs:if (para.text == ""):passelse:if (len(m.correct_batch([para.text])[0]['errors']) == 0):passelse:error_counter_kenlm += 1json_data = json.dumps(m.correct_batch([para.text])[0], sort_keys=False, indent=4, ensure_ascii=False)textBrowser.append(json_data)json_data_1 = json.loads(json_data)self.sourses = jsonpath(json_data_1, '$..source')self.targets = jsonpath(json_data_1, '$..target')textBrowser.append("\n")textBrowser.append(f"Chinese Total error: {error_counter_kenlm}")

运行后,PyQt主窗口界面卡死,一段时间后异常退出:

进程已结束,退出代码 -1073741819 (0xC0000005)

通过测试分析,发现出现异常的可能的原因:对于耗时长的函数,当采用多线程编程调用其函数,如果支线程频繁访问了界面对象可能会导致界面卡死,异常退出。

(在以上例子中,函数pycorrectorKenlm就不断的在访问界面对象textBrowser从而导致界面卡死。)

通过测试,发现在线程调用的函数(例:WTD)(包括线程调用的函数中所调用的函数)都不能频繁访问界面对象,否则可能会导致界面卡死,异常退出。

解决方法

以上述代码为例,将支线程中访问的界面对象去除,用一个临时变量保存数据,最终返回数据结果,同时编写一个QTimer函数,对返回的数据结果进行判断,返回值不为空,则在textBrowser中打印数据。(相当于开启两个线程)

修改后的程序:

def run_thread_WTD(self):self.process_info = []self.timer1.start(1000)threading.Thread(target=self.WTD).start()def WTD(self):word_path = self.word_path.text()# textBrowser为多行文本框QTextEditself.process_info = self.pycorrectorKenlm(word_path)def write_result_text(self):if self.process_info != []:for i in self.process_info:self.result_text.append(i)self.timer1.stop()self.process_info = []def pycorrectorKenlm(self, word_path):process_info = []error_counter_kenlm = 0try:m = Corrector(language_model_path='zh_giga.no_cna_cmn.prune01244.klm',custom_confusion_path_or_dict='my_custom_confusion.txt')#./ means current Pathexcept:process_info.append("Error")doc = docx.Document(word_path)for para in doc.paragraphs:if (para.text == ""):passelse:if (len(m.correct_batch([para.text])[0]['errors']) == 0):passelse:error_counter_kenlm += 1json_data = json.dumps(m.correct_batch([para.text])[0], sort_keys=False, indent=4, ensure_ascii=False)process_info.append(json_data)j	son_data_1 = json.loads(json_data)self.sourses = jsonpath(json_data_1, '$..source')self.targets = jsonpath(json_data_1, '$..target')process_info.append("\n")process_info.append(f"Chinese Total error: {error_counter_kenlm}")

这篇关于【PyQt错误集 - 1】:PyQt调用多线程导致窗口异常退出的问题分析(进程已结束,退出代码 -1073741819 (0xC0000005))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/820213

相关文章

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是