【问题标题】:How can I find out when a PyQt-application is idle?如何确定 PyQt 应用程序何时空闲?
【发布时间】:2010-10-25 06:40:20
【问题描述】:

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

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

【问题讨论】:

    标签: qt events concurrency pyqt


    【解决方案1】:

    您至少有两种不同的选择,可以使用线程或使用计时器。 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 线程,两者都有不同的原因。

    【讨论】:

    • 倒数第二段非常重要。在 PyQt 中使用线程之前,请确保您了解全局解释器锁定的效果。 QThreads受到该锁的影响。
    【解决方案2】:

    看看QAbstractEventDispatcher但是 ...我仍然建议使用线程。原因:

    1. 它将是便携式的
    2. 如果您在代码中出错,事件循环将会中断 -> 您的应用可能会挂起、突然退出等。
    3. 在进行预加载时,您的应用会挂起。除非您可以一次预加载一个内容,否则不会处理任何事件,它们都非常小,加载只需几毫秒,等等。

    当内容准备好时,使用线程并向主线程发送信号。这要简单得多。

    【讨论】:

      猜你喜欢
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2013-09-05
      • 2010-12-08
      • 1970-01-01
      • 2011-02-13
      相关资源
      最近更新 更多