我想知道我的应用程序何时处于空闲状态,以便我可以预加载一些内容。是否在PyQt中实现了类似事件?
(我也可以用线程来做,但这感觉太复杂了。)
答案 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。 但是 ......我仍然建议使用一个帖子。原因:
使用线程并在内容准备好后向主线程发送信号。它简单得多。