我有一个用 PySide(Qt Python 绑定)编写的 Qt 应用程序。这个应用程序有一个 GUI 线程和许多不同的 QThreads,它们负责执行一些繁重的工作——一些相当长的任务。由于如此长的任务有时会卡住(通常是因为它正在等待服务器响应),因此应用程序有时会冻结。
因此,我想知道是否可以安全地QCoreApplication.processEvents()
每隔一秒左右“手动”调用一次,以便清除(处理)GUI 事件队列?这是个好主意吗?
随时调用 QCoreApplication.processEvents() 是安全的。文档明确说明了您的用例:
当您的程序忙于执行长时间操作(例如复制文件)时,您可以偶尔调用此函数。
但是,没有充分的理由为什么线程会阻塞主线程中的事件循环。(除非你的系统真的跟不上。)所以无论如何这都值得研究。
人们可能会发现一些有用的提示:
A. 您需要注意以下事项:
每隔一段时间,线程想要将东西发送回主线程。所以他们发布一个事件并调用 processEvents
如果从事件中运行的代码也调用了 processEvents,那么 python 可以代替返回到下一条语句,而是再次调度一个工作线程,然后可以重复这个过程。
最终结果可能是成百上千个嵌套的 processEvent 语句,然后可能导致超出递归级别的错误消息。
道德 - 如果您正在运行多线程应用程序,请不要在由在主线程中运行的线程启动的任何代码中调用 processEvents。
B. 你需要知道 CPython 有一个全局解释器锁 (GIL),它限制线程,以便在任何时候只有一个可以运行,并且 Python 决定运行哪些线程的方式是违反直觉的。从工作线程运行进程事件似乎并没有按照它所说的那样执行,并且 CPU 时间没有分配给主线程或 Python 内部线程。我仍在试验,但似乎让工作线程休眠几毫秒可以让其他线程查看。