Windowsコード集 上のページ

#0002 アイドリングを効率よく扱う

通常、通知メッセージのディスパッチは1箇所で定義する事が通例です。 しかし以下のような関数にしてしまうと、DOSっぽいコーディングや重い処理を行う時に使えます。
BOOL DoEvents()
{
    MSG msg;
    if(PeekMessage(&msg,NULL,0,0)){
        if(msg.message == WM_QUIT)return FALSE;
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (IsWindow(hwnd) != NULL);
}
下線部はアプリケーションによって異なります。 ここにはメインウィンドゥになるハンドルを置いておいてください。
この関数の返り値がFALSEのときは、メインウィンドゥが破棄された事を示すので、呼び出し元では確実にアプリケーションを終了させるようにする必要があります。 例えば、こんな感じ。
BOOL LongLongFunction()
{
    while(1){
        if(!DoEvents())return FALSE;

          :
          :
          :

    }
    return TRUE;
}
そう大それた事でもなく、ただループの先頭にでも付けておけば良いです。
こうする事で、"中断ボタン"などの処理も可能になります。

また、こんな風に使う方法もあります。 ウィンドゥ生成後のメッセージループとして使ってしまいます。 私の場合DoEventsを更に改良して、周期動作の呼び出しなどにも利用させています(→タイマー動作あれこれ)。
int WINAPI WinMain(....)
{
    // Window生成
       :

    // メッセージ処理
    while(DoEvents()){;}
    return 0;
}


上のページ