Win32中的Sleep()会使程序无响应

时间:2012-12-13 10:01:46

标签: c++ winapi sleep

基本上就是标题所说的内容。当用户按下该特定按钮时,我想每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);
     }

这是正常的吗?如果不是造成这种情况的原因?

2 个答案:

答案 0 :(得分:8)

WndProc不会在应用程序中异步处理消息,这意味着预计会快速处理所有消息并立即传递返回值。您不能在UI线程中Sleep,因为它会阻止其他UI事件被处理。应该在工作线程中执行可能需要很长时间的繁重工作或同步请求/作业。至少有三种可行的选择:

  1. 为任务创建新的(worker thread)。
  2. 如果任务可能经常进行,请改用thread pool
  3. 设置并订阅timer events

答案 1 :(得分:0)

我认为对Sleep()的调用可能会阻止您从WndProc返回,因此您的应用程序不会处理5秒内的事件。我建议你尝试在1s,2s,...,5s订阅5个计时器事件。就像收到计时器消息时一样,按钮文本必须改变。我不知道如何做到这一点。