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
2009年05月30日 【プログラミング】 | コメント(0) |

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


この記事へのトラックバック
この記事へのコメント

コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。