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

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

有帮助吗?

解决方案

您至少有两种不同的选择,你可以使用一个线程,或者使用一个计时器。 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将无法启动滞后:

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

显然,上述是C ++的语法,但相对于PyQt的回答,使用单发定时器。在Python中,全局解释锁基本上会呈现很大的并发性毫无意义如果实现被内的Python执行被调用。

您也然后有使用Python线程或线程的Qt的选择,都是良好的原因不同。

其他提示

看一下 QAbstractEventDispatcher. ...我还是建议用线程。理由:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top