一部のコンテンツをプリロードできるように、アプリケーションがアイドル状態になったことを知りたいのですが。PyQtに実装されているイベントなどはありますか?
(スレッドを使用することもできますが、これは複雑すぎるように感じます。)
一部のコンテンツをプリロードできるように、アプリケーションがアイドル状態になったことを知りたいのですが。PyQtに実装されているイベントなどはありますか?
(スレッドを使用することもできますが、これは複雑すぎるように感じます。)
少なくとも2つの異なるオプションがあり、スレッドを使用するか、タイマーを使用できます。QtのQThreadクラスは、GUIスレッドを含む他のスレッドが実行されていないときにのみ処理するように設定できるpriorityプロパティを提供します。もう1つのオプションは、シングルショットタイマーです。タイムアウトが0ミリ秒のQTimerは、イベントをイベントキューの後ろに配置して、すでにアクティブまたはスケジュールされているすべてのイベントと同期機能が最初に処理されるようにします。
コードでは、2つのオプションは次のようになります。
// (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をご覧ください。しかし...私はまだスレッドを使用することをお勧めします。理由:
スレッドを使用して、コンテンツの準備ができたらメインスレッドにシグナルを送信します。それはとても簡単です。