【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

相关文章

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W