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

The*_* K. 1 c++ winapi sleep

基本上就是标题所说的.当用户按下该特定按钮时,我想每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);
     }
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*wan 8

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

  1. 为任务创建一个新的(工作线程).
  2. 如果任务可能经常进行,请改用线程池.
  3. 设置和订阅计时器事件.