2013-02-22 36 views
2

我有一个用PySide编写的Qt应用程序(Qt Python绑定)。这个应用程序有一个GUI线程和许多不同的QThreads负责执行一些繁重的任务 - 一些相当长的任务。由于这种长时间的任务有时会受阻(通常是因为它正在等待服务器响应),因此应用程序有时会冻结。在设定的时间间隔内调用QCoreApplications.processEvents()是否安全?

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

+1

为什么主线程冻结,如果所有工作都是由其他线程完成的? – wRAR 2013-02-22 00:40:22

+0

这是一个很好的问题,我没有很好的答案。我曾经问过Qt论坛,他们说这是因为应用程序没有处理任何事件,这就是为什么它看起来被冻结。可能还有一些事实,即有100多个线程同时运行。 – 2013-02-22 00:45:56

+0

如果主线程在Qt事件循环中,它应该处理消息(除非您的机器太忙,但与您的代码没有直接关系)。 – wRAR 2013-02-22 00:51:22

回答

1

随时调用QCoreApplication.processEvents()是安全的。 The docs明确说明你的使用情况:

你偶尔可以调用此功能时,你的程序是忙 执行长操作(如复制文件)。

尽管为什么线程会阻塞主线程中的事件循环,没有什么好的理由。 (除非你的系统真的跟不上。)所以这是值得研究的。

0

一对夫妇提示人们会觉得非常有用:

答:您需要提防如下:

  1. 几乎每隔一段时间线程想送东西回主线程。所以他们发布一个事件并且调用processEvents

  2. 如果代码从事件运行也调用processEvents,那么不是返回到下一个语句,python可以重新派发一个工作线程,然后可以重复这个过程。

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

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

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

相关问题