1

基本上就是标题所说的。当用户按下特定按钮时,我想每 1 秒更新一次按钮包含的文本。我注意到,当程序没有焦点时,它可以正常工作并且文本会正确刷新,但是当我将鼠标悬停在程序上或尝试单击它的菜单时,Windows 会通知我程序没有响应并询问我是否我希望它终止。当循环结束时,程序返回其正常状态。此外,当它是Sleep()时我可能已经完成的任何操作(比如移动它或关闭它)都是在循环之后执行的。这是一段代码:

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 事件。任何可能需要很长时间的繁重工作或同步请求/作业都应该在工作线程中执行。至少有三个可行的选择:

  1. 为任务创建一个新的(工作线程)。
  2. 如果该任务可能会经常完成,请改用线程池
  3. 设置和订阅定时器事件
于 2012-12-13T10:05:56.193 回答
0

我认为调用Sleep()可能会阻止您从 WndProc 返回,因此您的应用程序在 5 秒内未处理传入事件。我建议您尝试在 1s、2s、...、5s 内订阅 5 个计时器事件。就像收到计时器消息时,按钮文本必须更改。我不知道该怎么做。

于 2012-12-13T10:05:58.143 回答