如何找出PyQt应用程序何时空闲?

时间:2009-05-11 12:41:40

标签: qt events concurrency pyqt

我想知道我的应用程序何时处于空闲状态,以便我可以预加载一些内容。是否在PyQt中实现了类似事件?

(我也可以用线程来做,但这感觉太复杂了。)

2 个答案:

答案 0 :(得分:3)

您至少有两个不同的选项,您可以使用线程或使用计时器。 Qt的QThread类提供了一个优先级属性,您可以将其设置为仅在没有其他线程运行时进行处理,其中包括GUI线程。另一种选择是单发计时器。超时为0毫秒的QTimer将事件放在事件队列的后面,以便首先处理已激活或已调度的所有事件和同步函数。

在代码中,这两个选项如下所示:

// (1) use idle thread processing
MyQThreadSubclass idleThread;
idleThread.run(QThread::IdlePriority);

// (2) use QTimer::singleShot
QTimer::singleShot(0, receiver, SLOT(doIdleProcessingChunk));

如果你选择单拍QTimer,请注意你做了多少处理,因为你仍然可以阻止Gui。您可能希望将其分成块,以便GUI不会开始滞后:

// slot
void doIdleProcessingChunk() {
    /* ... main processing here ... */
    if (chunksRemain())
        QTimer::singleShot(0, receiver, SLOT(doIdleProcessingChunk));
}

显然,以上是C ++语法,但要回答PyQt,请使用单次计时器。在Python中,如果调用的实现是在Python中执行的,那么global interpreter lock基本上会使你的大部分并发变得毫无意义。

然后你也可以选择使用Python线程或Qt线程,两者都有不同的原因。

答案 1 :(得分:1)

看看QAbstractEventDispatcher但是 ......我仍然建议使用一个帖子。原因:

  1. 便携式
  2. 如果您在代码中出错,则事件循环将被破坏 - >你的app可能会挂起,突然退出等等。
  3. 当预加载发生时,您的应用程序会挂起。除非您可以一次预加载一个内容,它们都非常小,加载只需几毫秒等,否则不会处理任何事件。
  4. 使用线程并在内容准备好后向主线程发送信号。它简单得多。