1

aSleep(sometime)は典型的な無限ウィンドウ メッセージ ループで目的を果たしますか?それとも単に役に立たないか、有害でさえあるのでしょうか?

一部の例には が含まれていますがSleep、ほとんどの例には含まれていません。

    // Main message loop:
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        Sleep(500); // As pointed out below, completely nonsense
        Sleep(5); // Would have been the better example, but still bad
    }
4

3 に答える 3

4

その呼びかけは無意味です。GetMessageキューにメッセージがあるまで待機し、メッセージがある間、プログラムが CPU を占有することはありません。すでに行っていることをやろうとする必要はありません。

有害であることについては、おそらく(おそらく)そうなるでしょう!キューに 1000 件のメッセージがある場合、すべてのメッセージを処理する前に 500 秒間スリープ状態になります。その間、1000 件をはるかに超えるメッセージが蓄積されます。ウィンドウが完全に役に立たなくなるまでそう長くはかかりません。Windows は多くのメッセージを受け取ります。マウスがウィンドウ上を移動するたびに、応答するまで 0.5 秒待つと言うつもりですか?

また、ドキュメントから、GetMessageエラーが発生した場合は -1 が返されます。-1 は 0 ではないため、ループはとにかくメッセージを処理しようとします。より正しい方法は、ハンドラーを配置するか、完全に終了することです。

while (GetMessage (&msg, NULL, 0, 0) > 0)
于 2012-06-16T17:35:40.150 に答える
2

このSleep()呼び出しはまったく役に立たず、有害でもあります。 GetMessage()ウィンドウのいずれかでメッセージの準備ができるまで、スレッドはすでにスリープ状態になっています。を追加するSleep(500)と、1 秒間に 2 つのメッセージしか処理しないため、ウィンドウが応答しなくなります。

于 2012-06-16T17:36:17.997 に答える
1

アプリが機能しない場合でも、Windows は機能します。これについて技術的になる必要さえありません。あなたが投稿したコード例は、電話が鳴っているときに顧客サービス担当者が仕事中に寝ているのと同じです。を削除しSleep()ます。

于 2012-06-16T17:47:05.370 に答える