定时调用QCoreApplication.processEvents()安全吗?

2 投票
2 回答
2395 浏览
提问于 2025-04-17 16:42

我有一个用PySide写的Qt应用程序(Qt的Python绑定)。这个应用程序有一个图形界面线程和很多不同的QThreads,这些线程负责处理一些比较耗时的任务。因为这些长时间的任务有时会卡住(通常是因为在等待服务器的响应),所以应用程序有时会出现冻结的情况。

因此,我在想每隔一秒手动调用一下QCoreApplication.processEvents()是否安全,这样可以清理(处理)图形界面的事件队列?这样做到底算不算好主意呢?

2 个回答

0

这里有几个小提示,可能对大家有帮助:

A. 你需要注意以下几点:

  1. 线程有时候会想把信息发送回主线程。所以它们会发布一个事件,并调用processEvents。

  2. 如果事件中的代码也调用了processEvents,那么程序就不会直接返回到下一条语句,而是可能会再次调度一个工作线程,这样就会重复这个过程。

这样一来,可能会出现成百上千个嵌套的processEvent语句,最终导致“递归层级超出限制”的错误信息。

总结一下 - 如果你在运行一个多线程的应用程序,绝对不要在主线程启动的线程中调用processEvents。

B. 你还需要知道,CPython有一个叫做全局解释器锁(GIL)的东西,它限制了线程的运行,也就是说在任何时候只能有一个线程在运行。而Python决定哪个线程运行的方式可能让人摸不着头脑。从工作线程中运行process events似乎并没有按预期工作,CPU时间并没有分配给主线程或Python内部线程。我还在实验中,但看起来让工作线程休眠几毫秒可以让其他线程有机会运行。

1

你可以随时安全地调用 QCoreApplication.processEvents() 这个函数。文档里明确提到你的使用场景:

当你的程序正在忙着执行一个耗时的操作(比如复制文件)时,你可以偶尔调用这个函数。

不过,线程不应该阻塞主线程的事件循环,这样是没有什么好理由的。(除非你的系统真的跟不上。)所以这点还是值得关注一下的。

撰写回答