Python 写了个 GUI 程序,运行久了老是闪退 咋解决

229 天前
 shuyouning32
需求是这样的。

gui 对象中有个 tableList 数组,数组中有个对象 执行 线程 run 任务。
gui 定时了一个任务 每 1 分钟去刷 数组对象 的 run 任务
刷久了 一晚上 起来看不到程序了。 头疼死了。

# 定时任务
def timer_task(self):
# 定时任务的具体逻辑
print("定时任务执行中...")
# 使用线程池并发执行
# with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor:
# futures = [executor.submit(instance.start) for instance in self.tableList]
# # 等待所有线程完成
# for future in concurrent.futures.as_completed(futures):
# future.result()
with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor: # 调整线程池大小
futures = []
for instance in self.tableList:
if not self.task_queue.full(): # 检查队列是否已满
self.task_queue.put(instance)
future = executor.submit(self.safe_start, instance)
futures.append(future)
# 等待所有线程完成
for future in concurrent.futures.as_completed(futures):
future.result()
self.task_queue.get() # 任务完成后从队列中移除
# 执行任务
def safe_start(self, instance):
with self.lock: # 使用线程锁保护共享资源
try:
instance.start()
except Exception as e:
print(f"任务执行失败: {e}")
有木有大佬能帮忙看看的!
3942 次点击
所在节点    Python
16 条回复
awsl2333
229 天前
定时任务加个 try catch 看看
lyxxxh2
229 天前
gui 不晓得。
我命令行闪退不怕,因为有错误信息,能否用命令来启动 gui?
fds
229 天前
没有错误日志?
qiuhang
229 天前
这没法看,可能的错误原因很多。你别这样写,你把 safe_start 下面的 print(f"任务执行失败: {e}") 换成 import traceback; print(traceback.format_exc()) 看看具体调用栈相关报错信息。最好 timer_task 下面也包一层 try except 捕获多线程调用过程中可能存在的错误信息
qiuhang
229 天前
@qiuhang 对了,你走命令行调用启动 gui 程序,错误信息就能打印到控制台。或者你调用 logging 写入到日志文件也行,甚至直接 open 个文件写入到文件都可以,总之你得看报错信息才能解决问题。
araraloren
229 天前
你的代码加密了,我看不懂
GaGim
229 天前
你要加个 try catch 捕捉一下异常,看是哪里线程冲突了,也不知道你用哪个 gui 库,贴个多线程代码根本看不出什么。
fenglirookie
229 天前
gpt 解决
Ct5T66PVR1bW7b2z
229 天前
如果是 pyqt 、pyside ,更新 gui 用 signal ,不然很容易退
calvinHxx
229 天前
gui 程序闪退 无外乎几个场景:
1.工作线程操作视图, 视图只能在主线程(gui 线程) 操作
2.内存泄漏,地址访问错误(python 应该暂时不用管)
3.栈溢出,爆栈
4.内存爆了。

一个一个排查看看。大部分 gui 程序前三点问题居多。
AccelerXu
229 天前
多半是内存暴了
strickland3
228 天前
把 max_workers 改小一点试试
dajj
228 天前
import faulthandler
faulthandler.enable() # enable faulththandler catchSIGSEGV , print system error


在入口文件加上这两行,要求输出致命错误
shuyouning32
228 天前
程序打包了 exe 没有搞 日志,新手刚入门
iorilu
228 天前
肯定是多线程导致得

用 pyqt 或 pyside 这些东西, 如果要用多线程一定要用 pyqt 框架自带得 qthread 等东西
jackOff
209 天前
内存回收机制吧,主要是 python 会无视 pyqt 的底层 c++语法直接强制回收 qt 控件(有时候就是一个 paint 刷新就触发了,具体原因不明),所以语法上要特别注意必须显式声明每个对象的父类,我习惯上搞一个全局变量存放控件实例,这里建议你的线程池不使用 with 语法,改成声明一个对象:self.executor

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1119246

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX