次の方法で共有


CWinApp::OnIdle

アイドル処理を実行するには、このメンバー関数をオーバーライドします。

virtual BOOL OnIdle(
   LONG lCount 
);

パラメーター

  • lCount
    アプリケーションのメッセージ キューが空の場合に OnIdle が呼び出されるたびにインクリメントするカウンター。この計算は 0 に新しいメッセージが処理されるたびにリセットされます。アプリケーションがこのメッセージを処理しないでアイドル状態の相対的な時間を決定するために lCount のパラメーターを使用できます。

戻り値

非ゼロより多くのアイドル処理時間を受信する; これ以上のアイドル時間が必要でない場合は 0。

解説

OnIdle は既定のメッセージ ループでアプリケーションのメッセージ キューが空のときに呼び出されます。独自のバックグラウンド タスクのアイドル ハンドラーを呼び出すには、オーバーライド関数を使用します。

OnIdle はアイドル処理時間が必要ないことを示す場合は 0 を返します。lCount のパラメーターは、常に新しいメッセージが処理されるメッセージ キューが空の場合は 0 にリセットすると OnIdle が呼び出されるたびにインクリメントします。自分の異なるアイドル ルーチンをこの数に基づいて呼び出すことができます。

次は、アイドル ループ処理をまとめています:

  1. Microsoft Foundation Class ライブラリのメッセージ ループがメッセージ キューをチェックし、保留中のメッセージが見つからない場合、アプリケーション オブジェクトの OnIdle を呼び出し、lCount の引数として 0 を指定します。

  2. OnIdle、処理を実行し、さらに処理を行うには、それを示す以外の値が再度呼び出される必要があります。

  3. メッセージ ループ再度チェック メッセージ キュー。メッセージが保留中である、OnIdle を再度呼び出し、lCount の引数をインクリメントします。

  4. 最終的に、OnIdle はアイドル タスクをすべて処理を完了し、0 を返します。これは、次のメッセージはメッセージ キューから受け取った、その時点から 0 に設定されている引数とのアイドル サイクルの再起動を示すまでメッセージ ループを OnIdle 呼び出すようにする場合。

OnIdle が返されるまで、アプリケーションがユーザー入力を処理できないため OnIdle 中にかかるタスクを実行しないでください。

[!メモ]

OnIdle の更新の既定の実装では、メニュー項目とツール バー ボタンなどのユーザー インターフェイス オブジェクトにコマンド、内部のデータ構造の後処理を実行します。したがって、OnIdleをオーバーライドした場合は、オーバーライドされたバージョンのの lCount の CWinApp::OnIdle を呼び出す必要があります。最初の呼び出しすべての基本クラスのアイドル処理 (つまり、基本クラス OnIdle までは 0 を返します)。基本クラスの処理が完了する前に処理を実行する必要がある場合、作業をする適切な lCount を選択するには、基本クラスの実装を確認します。

メッセージはメッセージ キューから取得されるたびに、OnIdle に呼び出されます。しない場合は、CWinThreadIsIdleMessageをオーバーライドできます。アプリケーションが非常に短くタイマーを設定したり、システムが WM_SYSTIMER のメッセージを送信 OnIdle は、繰り返し呼び出され、パフォーマンスが著しく低下します。

使用例

次の 2 種類の例は OnIdleを使用する方法を示します。最初の例は lCount の引数を使用して 2 個のアイドル状態のタスクをタスクに優先度を付ける処理します。最初のタスクは優先順位が高く、これを可能な限りする必要があります。2 番目のタスクはユーザー入力に長い一時停止がある場合にだけ、の方が重要で、される必要があります。OnIdleの基本クラス バージョンに対する呼び出しに注意してください。2 番目の例は、優先順位のアイドル状態のタスクのグループを管理します。

BOOL CMyApp::OnIdle(LONG lCount)
{
   BOOL bMore = CWinApp::OnIdle(lCount);

   if (lCount == 0)
   {
      TRACE(_T("App idle for short period of time\n"));
      bMore = TRUE;
   }
   else if (lCount == 10)
   {
      TRACE(_T("App idle for longer amount of time\n"));
      bMore = TRUE;
   }
   else if (lCount == 100)
   {
      TRACE(_T("App idle for even longer amount of time\n"));
      bMore = TRUE;
   }
   else if (lCount == 1000)
   {
      TRACE(_T("App idle for quite a long period of time\n"));
      // bMore is not set to TRUE, no longer need idle
      // IMPORTANT: bMore is not set to FALSE since CWinApp::OnIdle may
      // have more idle tasks to complete.
   }

   return bMore;
   // return TRUE as long as there are any more idle tasks
}

2 番目の例

// In this example, four idle loop tasks are given various 
// opportunities to run:
// Task1 is always given a chance to run during idle time, provided
//   that no message has queued up while the framework was processing
//   its own idle loop tasks (at lCount levels 0 and 1).
// Task2 is given a chance to run only if Task1 has already run,
//   provided that no message has queued up while Task1 was running.
// Task3 and Task4 are given a chance to run only if both Task1 and
//   Task2 have already run, and no message has queued up in the mean
//   time.  If Task3 gets its chance to run, then Task4 always gets
//   a chance to run immediately after Task3.

BOOL CMyWinApp::OnIdle(LONG lCount)
{
   // In this example, as in most applications, you should let the
   // base class CWinApp::OnIdle complete its processing before you
   // attempt any additional idle loop processing.
   if (CWinApp::OnIdle(lCount))
      return TRUE;   

   // The base class CWinApp::OnIdle reserves the lCount values 0 
   // and 1 for the framework's own idle processing.   If you wish to
   // share idle processing time at a peer level with the framework,
   // then replace the above if-statement with a straight call to
   // CWinApp::OnIdle; and then add a case statement for lCount value
   // 0 and/or 1. Study the base class implementation first to 
   // understand how your idle loop tasks will compete with the 
   // framework's idle loop processing.

   switch (lCount)
   {
      case 2:
         Task1();
         return TRUE; // next time give Task2 a chance
      case 3:
         Task2();
         return TRUE; // next time give Task3 and Task4 a chance
      case 4:
         Task3();
         Task4();
         return FALSE; // cycle through the idle loop tasks again
   }
   return TRUE;
}

必要条件

ヘッダー: afxwin.h

参照

関連項目

CWinApp クラス

階層図