多くのアプリケーションは、"バックグラウンドで" 長い処理を実行します。パフォーマンスに関する考慮事項によって、このような作業にマルチスレッドを使用する必要がある場合があります。 スレッドには追加の開発オーバーヘッドが伴うので、MFC が OnIdle 関数で実行するアイドル時間作業などの単純なタスクには推奨されません。 この記事では、アイドル処理について重点的に取り上げます。 マルチスレッドの詳細については、「マルチスレッド トピック」を参照してください。
一部の種類のバックグラウンド処理は、ユーザーがアプリケーションと対話していない間隔で適切に実行されます。 Microsoft Windows オペレーティング システム用に開発されたアプリケーションでは、長いプロセスを多数の小さなフラグメントに分割することで、アイドル時間処理を実行できます。 各フラグメントを処理した後、アプリケーションは PeekMessage ループを使用して Windows に実行コントロールを生成します。
この記事では、アプリケーションでアイドル処理を行う 2 つの方法について説明します。
MFC のメイン メッセージ ループでの PeekMessage の使用。
別の PeekMessage ループをアプリケーション内の別の場所に埋め込む。
MFC メッセージ ループ内の PeekMessage
MFC を使用して開発されたアプリケーションでは、 CWinThread
クラスのメイン メッセージ ループに 、PeekMessage Win32 API を呼び出すメッセージ ループが含まれています。 このループは、メッセージ間のOnIdle
のCWinThread
メンバー関数も呼び出します。 アプリケーションは、 OnIdle
関数をオーバーライドすることで、このアイドル時間にメッセージを処理できます。
注
Run
、OnIdle
、およびその他の特定のメンバー関数が、クラス CWinThread
ではなくクラス CWinApp
のメンバーになりました。 CWinApp
は、CWinThread
から派生しています。
アイドル処理の実行の詳細については、MFC リファレンスの OnIdle を 参照してください。
アプリケーション内の他の場所に埋め込まれた PeekMessage
アプリケーションでアイドル処理を実行する別の方法として、いずれかの関数にメッセージ ループを埋め込む必要があります。 このメッセージ ループは、 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
を繰り返し呼び出します。 その呼び出しが 0 以外の値を返す限り、ループは通常のメッセージ変換とディスパッチを実行するために CWinThread::PumpMessage
を呼び出します。 PumpMessage
は文書化されていませんが、Visual C++ インストールの \atlmfc\src\mfc ディレクトリにある ThrdCore.Cpp ファイルでそのソース コードを調べることができます。
内部ループが終了すると、外側のループは、 OnIdle
の 1 つ以上の呼び出しでアイドル処理を実行します。 最初の呼び出しは MFC の目的を達成するためのものです。 OnIdle
に対して追加の呼び出しを行って、独自のバックグラウンド作業を行うことができます。
アイドル処理の実行の詳細については、MFC ライブラリ リファレンスの OnIdle を参照してください。