睡眠()在Win32中,使程序无法响应(Sleep() in Win32 makes program

2019-08-04 01:08发布

基本上完全相同的标题说什么。 我想更新一个按钮包含每1秒的文字,当用户按下特定的按钮。 我注意到,当程序不具有焦点它工作正常的和文本正确刷新,但是,当我将鼠标悬停在程序或当我试图点击其菜单的Windows告诉我,该程序没有响应,并且问我,如果我希望它结束​​。 当循环结束程序返回到正常状态。 此外,我可能会做的(如移动它或关闭它),而这是睡眠的任何行动()-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);
     }

这是正常的吗? 如果不是什么造成的?

Answer 1:

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

  1. 创建一个新的( 工作线程 )的任务。
  2. 如果任务很可能是经常做的,使用线程池来代替。
  3. 设置和订阅计时器事件 。


Answer 2:

我想调用Sleep()可能让你从WndProc中返回,因此您的申请不处理进来的事件为5秒。 我建议你尝试订阅到1S,2S,...,5S 5个计时器事件。 当计时器消息收到Like按钮文本必须改变。 我不知道的方式该怎么做了我的头顶。



文章来源: Sleep() in Win32 makes program unresponsive
标签: c++ winapi sleep