我想知道我的应用程序何时空闲,以便我可以预加载一些内容。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。您可能希望将其分成块,以便 GUI 不会开始滞后:
// slot
void doIdleProcessingChunk() {
/* ... main processing here ... */
if (chunksRemain())
QTimer::singleShot(0, receiver, SLOT(doIdleProcessingChunk));
}
显然,上面是 C++ 语法,但要回答 PyQt,请使用单次计时器。在 Python 中,如果被调用的实现是在 Python 中执行的,那么全局解释器锁基本上会使您的大部分并发变得毫无意义。
然后,您还可以选择使用 Python 线程或 Qt 线程,两者都有不同的原因。
看看QAbstractEventDispatcher。但是......我仍然建议使用线程。原因:
使用线程并在内容准备好时向主线程发送信号。这要简单得多。