次の方法で共有


アイドリング ループ処理

多くのアプリケーションは実行時間のかかる操作をバックグラウンドの 「」、パフォーマンスに関する考慮事項を、マルチスレッドをそのような作業に使用します。スレッドには追加の開発のオーバーヘッドを伴います、 MFC が OnIdle の関数にすることアイドル作業などの単純なタスクには推奨されません。この技術情報がアイドルな処理について説明します。マルチスレッドに関する詳細については、 マルチスレッドのトピックを参照してください。

ユーザーがアプリケーションで他にやり取りしていないこと、ある種のバックグラウンド処理がその間に適切に実行されます。Microsoft Windows オペレーティング システム用に開発されたアプリケーションでは、アプリケーションは多数の小さなフラグメントに長いプロセスの分割によって処理されるアイドルを実行できます。各フラグメントを処理した後、アプリケーションは PeekMessage のループを使用して Windows に実行制御を説明します。

この技術情報では、アプリケーションのアイドルな処理をする 2 とおりの方法を示しています:

  • MFC のメイン メッセージ ループの PeekMessage を使用します。

  • PeekMessage の別のループをアプリケーション内のどこかに埋め込みます。

MFC のメッセージ ループの PeekMessage

MFC で開発されたアプリケーションでは CWinThread のクラスのメイン メッセージ ループは PeekMessage の Win32 API をダイヤルするメッセージ ループが含まれています。このループは、メッセージの間の CWinThreadOnIdle のメンバー関数をダイヤルします。アプリケーションは OnIdle 関数をオーバーライドすることによって、このアイドル時間のメッセージを処理できます。

[!メモ]

これで、実行OnIdleおよびそのほかのメンバー関数は、クラス CWinAppではなく、クラス CWinThread のメンバーです。CWinAppCWinThread から派生します。

処理するアイドル状態の実装に関する詳細については、 *" MFC リファレンス "*の OnIdle を参照してください。

他の場所で PeekMessage アプリケーションで

処理するアプリケーションでアイドル状態を実行するための別のメソッドは、関数の 1 種類のメッセージ ループを埋め込むことがあります。このメッセージ ループは CWinThread::Runで MFC のメイン メッセージ ループに似ていますが、見つかりました。このサンプルは、 MFC と開発されたアプリケーションの場合、ループ メイン メッセージ ループと同じ機能の多くが必要になることを意味します。次のコード片は、 MFC と互換性のあるメッセージ ループを記述することを示します:

BOOL bDoingBackgroundProcessing = TRUE;
while (bDoingBackgroundProcessing) 
{ 
   MSG msg;
   while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
   { 
      if (!AfxGetApp()->PumpMessage()) 
      { 
         bDoingBackgroundProcessing = FALSE; 
         ::PostQuitMessage(0); 
         break; 
      } 
   } 
   // let MFC do its idle processing
   LONG lIdle = 0;
   while (AfxGetApp()->OnIdle(lIdle++ ))
      ;  
   // Perform some background processing here 
   // using another call to OnIdle
}

関数に埋め込まれたこのコードは、アイドルな処理がある限り、ループします。そのループ内で、入れ子になったループは、 PeekMessageをダイヤルします。この呼び出しがゼロ以外の値を返す限り、ループが正常に行われたメッセージの変換およびディスパッチ実行するに CWinThread::PumpMessage をダイヤルします。PumpMessage が文書化されていませんが、 \atlmfc\src\mfc directory of your Visual C C++ のインストールの ThrdCore.Cpp ファイルのソース・コードを確認できます。

一度内側のループは OnIdleに一つ以上の呼び出しと、外側のループ実行なアイドル処理を終了します。最初の呼び出しでは、 MFC の用です。OnIdle にするために、バックグラウンド アクティビティを作成するために追加の呼び出しを実行できます。

処理するアイドル状態の実装に関する詳細については、 MFC ライブラリの参照の OnIdle を参照してください。

参照

概念

MFC の一般的なトピック