2009年05月30日

VistaのWaitMessageのバグ?

VistaではメッセージキューにWM_QUITしかない場合、WaitMessage()が制御を返さないようです。(実際にはWM_QUITはキューには溜まらずにフラグが立つだけですが)

例えば次のようなコードで問題が発生します。

for(;;)
{
    WaitMessage();
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT) break;
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

このコードでもXPでは問題ないのですが、Vistaではアプリケーションを終了する際に、メッセージキューが空になり後はWM_QUITだけとなったところでWaitMessage()が処理を返さず、そのままゾンビプロセス化してしまいます。

私がCG系の技術デモを作るときは、アプリケーションがアクティブなときは全力で情報を更新しつつPeekMessageでウインドウメッセージを処理し、非アクティブになったら更新を止めてWaitMessageでメッセージを待つという方法をよく使っていましたが、非アクティブな状態でのメッセージループは上記のものと等価なコードになっています。そのため、非アクティブな状態で閉じようとすると、ゾンビプロセス化してしまいます。

これってどう考えても、仕様ではなくバグですよね?

タグ:Win32API
Posted by 新坂 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

この記事へのトラックバックURL

※ブログオーナーが承認したトラックバックのみ表示されます。

※言及リンクのないトラックバックは受信されません。


この記事へのトラックバック