1

基本的にはタイトルの内容とまったく同じです。ユーザーが特定のボタンを押したときに、ボタンに含まれるテキストを1秒ごとに更新したいと思います。プログラムにフォーカスがない場合は正常に動作し、テキストは正しく更新されますが、プログラムにカーソルを合わせているとき、またはプログラムのメニューをクリックしようとすると、Windowsからプログラムが応答しないことが通知され、終了してほしい。ループが終了すると、プログラムは通常の状態に戻ります。また、 Sleep()- ingの実行中に実行した可能性のあるアクション(移動やクローズなど)は、ループの後に実行されます。ここに少しのコードがあります:

case ID_BUTTON_START:
// Code executed when pressing Start Button.
char startButtonText[30];  // Storing next loop text
 for (int i=5; i>0; i--)
    {
       sprintf(startButtonText, "Starting in ... %d", i);
       SendMessage(hwndButtonStart, WM_SETTEXT, 0, (LPARAM)(startButtonText));
       Sleep(1000);
     }

これは正常ですか?そうでない場合、これを引き起こしているのは何ですか?

4

2 に答える 2

8

は、アプリケーション内でメッセージを非同期的に処理しません。WndProcつまり、すべてのメッセージが迅速に処理され、戻り値がすぐに配信されることが期待されます。Sleep他のUIイベントの処理をブロックするため、UIスレッドに参加しないでください。長時間かかる可能性のある重い作業や同期リクエスト/ジョブは、ワーカースレッドで実行する必要があります。少なくとも3つの実行可能なオプションがあります。

  1. タスクの新しい(ワーカースレッド)を作成します。
  2. タスクが頻繁に実行される可能性がある場合は、代わりにスレッドプールを使用してください。
  3. タイマーイベントを設定してサブスクライブします。
于 2012-12-13T10:05:56.193 に答える
0

の呼び出しによりSleep()、WndProcからの復帰が妨げられている可能性があるため、アプリケーションは5秒間着信イベントを処理していません。1秒、2秒、...、5秒で5つのタイマーイベントをサブスクライブすることをお勧めします。タイマーメッセージを受信したときのように、ボタンのテキストを変更する必要があります。頭のてっぺんからそれを行う方法がわかりません。

于 2012-12-13T10:05:58.143 に答える