在设置的时间间隔内安全地调用QCoreApplications.processEvents()吗?

时间:2013-02-22 00:37:55

标签: python qt events pyqt pyside

我有一个用PySide编写的Qt应用程序(Qt Python绑定)。这个应用程序有一个GUI线程和许多不同的QThreads负责执行一些繁重的工作 - 一些相当长的任务。因为这样的长任务有时会被卡住(通常是因为它正在等待服务器响应),应用程序有时会冻结。

因此我想知道每隔一秒左右手动调用QCoreApplication.processEvents()是否安全,以便清除(处理)GUI事件队列?这是一个好主意吗?

2 个答案:

答案 0 :(得分:1)

随时随地调用QCoreApplication.processEvents()是安全的。 The docs明确说明您的用例:

  

您可以在程序繁忙时偶尔调用此功能   执行长时间操作(例如复制文件)。

尽管线程会阻塞主线程中的事件循环,但没有充分的理由。 (除非你的系统真的无法跟上。)所以无论如何都值得研究。

答案 1 :(得分:0)

人们可能会发现一些有用的提示:

一个。您需要注意以下事项:

  1. 线程经常想把东西发回主线程。所以他们发布一个事件并调用processEvents

  2. 如果从事件运行的代码也调用processEvents而不是返回到下一个语句,python可以改为再次调度一个工作线程,然后可以重复这个过程。

  3. 这样做的最终结果可能是数百或数千个嵌套的processEvent语句,这些语句可能会导致超出递归级别的错误消息。

    道德 - 如果您正在运行多线程应用程序,请不要在由主线程中运行的线程启动的任何代码中调用processEvents。

    B中。您需要知道CPython有一个全局解释器锁(GIL),它限制线程,以便只有一个可以在任何时间运行,并且Python决定运行哪些线程的方式是违反直觉的。从工作线程运行进程事件似乎没有在罐头上执行的操作,并且CPU时间未分配给主线程或Python内部线程。我还在试验,但似乎让工作线程休眠几毫秒允许其他线程查看。