相关主题
{{discussion.title}}
最牛社区
首页
新主题
新回复
热门
注册
登录
Python 写了个 GUI 程序,运行久了老是闪退 咋解决
{{ getUsernameByUid(11668) }}
发布{{ getTimeInfo('2025-03-18 10:30:56') }}
#0
{{ getUsernameByUid(11668) }}
发布{{ getTimeInfo('2025-03-18 10:30:56') }}
#0
需求是这样的。
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}")
有木有大佬能帮忙看看的!
{{ getUsernameByUid(11669) }}
发布{{ getTimeInfo('2025-03-18 10:38:14') }}
#1
{{ getUsernameByUid(11669) }}
发布{{ getTimeInfo('2025-03-18 10:38:14') }}
#1
定时任务加个 try catch 看看
{{ getUsernameByUid(2936) }}
发布{{ getTimeInfo('2025-03-18 10:51:25') }}
#2
{{ getUsernameByUid(2936) }}
发布{{ getTimeInfo('2025-03-18 10:51:25') }}
#2
gui 不晓得。
我命令行闪退不怕,因为有错误信息,能否用命令来启动 gui?
{{ getUsernameByUid(677) }}
发布{{ getTimeInfo('2025-03-18 11:08:16') }}
#3
{{ getUsernameByUid(677) }}
发布{{ getTimeInfo('2025-03-18 11:08:16') }}
#3
没有错误日志?
{{ getUsernameByUid(4147) }}
发布{{ getTimeInfo('2025-03-18 11:17:56') }}
#4
{{ getUsernameByUid(4147) }}
发布{{ getTimeInfo('2025-03-18 11:17:56') }}
#4
这没法看,可能的错误原因很多。你别这样写,你把 safe_start 下面的 print(f"任务执行失败: {e}") 换成 import traceback; print(traceback.format_exc()) 看看具体调用栈相关报错信息。最好 timer_task 下面也包一层 try except 捕获多线程调用过程中可能存在的错误信息
{{ getUsernameByUid(4147) }}
发布{{ getTimeInfo('2025-03-18 11:20:37') }}
#5
{{ getUsernameByUid(4147) }}
发布{{ getTimeInfo('2025-03-18 11:20:37') }}
#5
对了,你走命令行调用启动 gui 程序,错误信息就能打印到控制台。或者你调用 logging 写入到日志文件也行,甚至直接 open 个文件写入到文件都可以,总之你得看报错信息才能解决问题。
{{ getUsernameByUid(8684) }}
发布{{ getTimeInfo('2025-03-18 12:56:41') }}
#6
{{ getUsernameByUid(8684) }}
发布{{ getTimeInfo('2025-03-18 12:56:41') }}
#6
你的代码加密了,我看不懂
{{ getUsernameByUid(8000) }}
发布{{ getTimeInfo('2025-03-18 13:17:02') }}
#7
{{ getUsernameByUid(8000) }}
发布{{ getTimeInfo('2025-03-18 13:17:02') }}
#7
你要加个 try catch 捕捉一下异常,看是哪里线程冲突了,也不知道你用哪个 gui 库,贴个多线程代码根本看不出什么。
{{ getUsernameByUid(11670) }}
发布{{ getTimeInfo('2025-03-18 13:31:16') }}
#8
{{ getUsernameByUid(11670) }}
发布{{ getTimeInfo('2025-03-18 13:31:16') }}
#8
gpt 解决
{{ getUsernameByUid(662) }}
发布{{ getTimeInfo('2025-03-18 14:07:31') }}
#9
{{ getUsernameByUid(662) }}
发布{{ getTimeInfo('2025-03-18 14:07:31') }}
#9
如果是 pyqt 、pyside ,更新 gui 用 signal ,不然很容易退
{{ getUsernameByUid(11671) }}
发布{{ getTimeInfo('2025-03-18 14:11:01') }}
#10
{{ getUsernameByUid(11671) }}
发布{{ getTimeInfo('2025-03-18 14:11:01') }}
#10
gui 程序闪退 无外乎几个场景:
1.工作线程操作视图, 视图只能在主线程(gui 线程) 操作
2.内存泄漏,地址访问错误(python 应该暂时不用管)
3.栈溢出,爆栈
4.内存爆了。
一个一个排查看看。大部分 gui 程序前三点问题居多。
{{ getUsernameByUid(1000) }}
发布{{ getTimeInfo('2025-03-18 14:36:36') }}
#11
{{ getUsernameByUid(1000) }}
发布{{ getTimeInfo('2025-03-18 14:36:36') }}
#11
多半是内存暴了
{{ getUsernameByUid(11672) }}
发布{{ getTimeInfo('2025-03-18 15:20:48') }}
#12
{{ getUsernameByUid(11672) }}
发布{{ getTimeInfo('2025-03-18 15:20:48') }}
#12
把 max_workers 改小一点试试
{{ getUsernameByUid(435) }}
发布{{ getTimeInfo('2025-03-18 15:49:42') }}
#13
{{ getUsernameByUid(435) }}
发布{{ getTimeInfo('2025-03-18 15:49:42') }}
#13
import faulthandler
faulthandler.enable() # enable faulththandler catchSIGSEGV , print system error
在入口文件加上这两行,要求输出致命错误
{{ getUsernameByUid(11668) }}
发布{{ getTimeInfo('2025-03-18 16:55:45') }}
#14
{{ getUsernameByUid(11668) }}
发布{{ getTimeInfo('2025-03-18 16:55:45') }}
#14
程序打包了 exe 没有搞 日志,新手刚入门
{{ getUsernameByUid(668) }}
发布{{ getTimeInfo('2025-03-18 19:46:21') }}
#15
{{ getUsernameByUid(668) }}
发布{{ getTimeInfo('2025-03-18 19:46:21') }}
#15
肯定是多线程导致得
用 pyqt 或 pyside 这些东西, 如果要用多线程一定要用 pyqt 框架自带得 qthread 等东西
{{ getUsernameByUid(post.updatedByUid) }}
编辑于 {{ getTimeInfo(post.UpdatedAt) }}
{{ getUsernameByUid(post.uid) }}
发布于 {{ getTimeInfo(post.CreatedAt) }}
# {{post.num}}
{{ getUsernameByUid(post.updatedByUid) }}
编辑于 {{ getTimeInfo(post.UpdatedAt) }}
{{ getUsernameByUid(post.uid) }}
发布于 {{ getTimeInfo(post.CreatedAt) }}
# {{post.num}}
{{ getUsernameByPostNum(post.mentionNum) }}
登录回复
#{{nav.post.anchor}}
{{ alert.text }}
关闭