Sleep 的疑问 我写了个程序,有一个无限循环会做一件事,做完之后Sleep(1000L),可我发现程序执行之后,就不能动了,现在发现事sleep执行时,程序时不会有响应的,我该怎么修改呢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Sleep是挂起当前线程,如果是主线程,则挂起Windows所有消息,感觉象死了一样 对sleep执行时进程就不处理任何消息了,如果需要的话建议你用多线程就可以解决了,sleep你可以减小延时,改成80就行了 对sleep执行时进程就不处理任何消息了,如果需要的话建议你用多线程就可以解决了,sleep你可以减小延时,改成80就行了-----------------------------------我得纠正一下,对sleep执行时进程就不处理任何消息了,只对主线程是这样,如果你另外开线程,在非主线程则进程仍可处理消息(实际上是由主线程处理) 如果是单线程的就没有必要作sleep啊。 使用sleep函数的不利只处在于期间不能处理其他的消息,如果时间太长,就好象死机一样,利用ColeDateTime类和ColeDateTimeSpan类实现延时: ColeDateTime start_time = ColeDateTime::GetCurrentTime(); ColeDateTimeSpan end_time = ColeDateTime::GetCurrentTime()-start_time; While(end_time.GetTotalSeconds() <= 2) { MSG msg; GetMessage(&msg,NULL,0,0); PreTranslateMessage(&msg); End_time = ColeDateTime::GetCurrentTime-start_time; } 这样在延时的时候我们也能够处理其他的消息。 使用sleep函数的不利只处在于期间不能处理其他的消息,如果时间太长,就好象死机一样,利用ColeDateTime类和ColeDateTimeSpan类实现延时: ColeDateTime start_time = ColeDateTime::GetCurrentTime(); ColeDateTimeSpan end_time = ColeDateTime::GetCurrentTime()-start_time; While(end_time.GetTotalSeconds() <= 2) { MSG msg; GetMessage(&msg,NULL,0,0); PreTranslateMessage(&msg); End_time = ColeDateTime::GetCurrentTime-start_time; } 这样在延时的时候我们也能够处理其他的消息。--------------------------------------------这样可以处理消息,不过循环太厉害了,占cpu太多,所以必要时候,还得加Sleep(50)这样比较好While(end_time.GetTotalSeconds() <= 2) { MSG msg; GetMessage(&msg,NULL,0,0); PreTranslateMessage(&msg); Sleep(50); End_time = ColeDateTime::GetCurrentTime-start_time; } 不会太消耗Cpu 对于这种问题用SetTimer(1,1000,NULL);和OnTimer(UINT nIDEvent)实现比较好。 我也考虑要用SetTimer和OnTimer,由于循环的复杂关系,暂时还没解决! 我写了个程序,有一个无限循环会做一件事,做完之后Sleep(1000L),可我发现程序执行之后,就不能动了,现在发现事sleep执行时,程序时不会有响应的,我该怎么修改呢!=================================================================================开个线程来处理 sleep函数最好不要用在循环中,比如for,while,这样很容易 无法响应可以使用定时器。 sleep函数最好不要用在循环中,比如for,while,这样很容易 无法响应可以使用定时器。-------------------------------->定时有时候是无法替代Sleep的比方在主线程中间有一段代码必须停下来等待某一件事件等到事件往下执行,不用循环等待,你用定时会非常麻烦,程序也会很乱。况且定时经过测试也是不安全的,系统忙的时候,定时消息会丢失。(主线程挂起后,定时消息会丢失,只恢复最后一个定时) Featured(我握着爱情的门票静静排队……) 楼主,你应该不尴尬了,上面的朋友把代码给你了,你自己适当加个小Sleep,就可以了呀 MFC的三点问题 请教VC高手 如何让我英文系统的VC编写的程序支持中文? 很奇怪的socket问题,错误代码:WSAECONNRESET (10054) 怎样得到文件上次的修改时间,要精确到毫秒。(现场给分) 我该如何开始学习VC 有没有函数能方便的截取OLECHAR*的一段内容。 对不起,我是菜鸟,请问ADO中刷新记录集Requery()的参数有哪些,如何使用?谢谢! 救命的位图资源! 斑竹大人 我有30分的可用分 怎么问问题只能给(0--0)分呀?真奇怪 大侠们 遇到一个错误解决不了请大家帮忙 如何读取另一弹出对话框上的输入信息
-----------------------------------我得纠正一下,对sleep执行时进程就不处理任何消息了,只对主线程是这样,如果你另外开线程,在非主线程则进程仍可处理消息(实际上是由主线程处理)
ColeDateTime start_time = ColeDateTime::GetCurrentTime();
ColeDateTimeSpan end_time = ColeDateTime::GetCurrentTime()-start_time;
While(end_time.GetTotalSeconds() <= 2)
{
MSG msg;
GetMessage(&msg,NULL,0,0);
PreTranslateMessage(&msg);
End_time = ColeDateTime::GetCurrentTime-start_time;
}
这样在延时的时候我们也能够处理其他的消息。
ColeDateTime start_time = ColeDateTime::GetCurrentTime();
ColeDateTimeSpan end_time = ColeDateTime::GetCurrentTime()-start_time;
While(end_time.GetTotalSeconds() <= 2)
{
MSG msg;
GetMessage(&msg,NULL,0,0);
PreTranslateMessage(&msg);
End_time = ColeDateTime::GetCurrentTime-start_time;
}
这样在延时的时候我们也能够处理其他的消息。--------------------------------------------
这样可以处理消息,不过循环太厉害了,占cpu太多,所以必要时候,还得加Sleep(50)
这样比较好While(end_time.GetTotalSeconds() <= 2)
{
MSG msg;
GetMessage(&msg,NULL,0,0);
PreTranslateMessage(&msg);
Sleep(50);
End_time = ColeDateTime::GetCurrentTime-start_time;
} 不会太消耗Cpu
=================================================================================
开个线程来处理
可以使用定时器。
可以使用定时器。
-------------------------------->
定时有时候是无法替代Sleep的比方在主线程中间有一段代码必须停下来等待某一件事件等到事件往下执行,不用循环等待,你用定时会非常麻烦,程序也会很乱。况且定时经过测试也是不安全的,系统忙的时候,定时消息会丢失。(主线程挂起后,定时消息会丢失,只恢复最后一个定时)