C3Lab研究室

Back to Title Page(OpenLab)タイトルページへ戻る

最終更新日: 1999年 03月 10日 水曜日

*メッセージのPumping

時間のかかる処理中のWindowsメッセージのPumping処理

 Windowsアプリケーションはそれぞれの処理の中で多くの時間的リソースを 消費すべきではない(適切なアプリケーション間動作のため)のですが、どうしても時間 のかかる処理を行わなければならないこともあります。
 そうした場合に、Windowsのシステムメッセージを処理する時間をWindows に与える事で、システムのメッセージを処理する時間をアプリケーション主体で決めること ができます。たとえば、大きなループの間に一回でもメッセージのPumpを行っておけば Windowsがメッセージ処理を行う事ができるため、画面の移動や再表示が行われ、画 面上もよりユーザーにとって好ましいことになります。

 方法は簡単で、以下に示すPumpMessage関数を定義し、時間を割り当てても 良いところで呼び出すだけです。

 使用時の注意点は、マルチスレッドの用に動作するアプリケーションになるため( Windowsのメッセージ処理のスレッドに一時的に処理を明け渡すので)、プログラム 自体もスレッドの再入にそなえたプログラムに工夫する場合があります。
 具体的には、ボタンやメニューアイコンで2重に動作されてはこまる部分を一時的に 選択不能にするなどして対応します。
 まずは試してみてください。いままで時間のかかる処理で画面の更新ができないために 表示が変なままのアプリケーションが見違えるようになりますよ。

メッセージのPumping関数

void PumpMessage(void);

void PumpMessage(void){
    MSG msg;
    while ( ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
        ::SendMessage(msg.hwnd,msg.message,msg.wParam,msg.lParam);
    }
}

Copyright (C) Kitaro 1999