1

一部のコンテンツをプリロードできるように、アプリケーションがアイドル状態になったことを知りたいのですが。PyQtに実装されているイベントなどはありますか?

(スレッドを使用することもできますが、これは複雑すぎるように感じます。)

4

2 に答える 2

3

少なくとも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スレッドを使用することもできますが、どちらもさまざまな理由で適しています。

于 2009-05-11T17:17:50.373 に答える
1

QAbstractEventDispatcherをご覧ください。しかし...私はまだスレッドを使用することをお勧めします。理由:

  1. ポータブルになります
  2. コードを間違えると、イベントループが壊れます->アプリがハングしたり、突然終了したりする可能性があります。
  3. プリロードが行われている間、アプリはハングします。コンテンツを一度に1つずつプリロードできない限り、イベントは処理されません。イベントはすべて非常に小さく、ロードには数ミリ秒しかかかりません。

スレッドを使用して、コンテンツの準備ができたらメインスレッドにシグナルを送信します。それはとても簡単です。

于 2009-05-11T13:19:46.040 に答える