做网站赚钱吗,重庆市建设工程信息网安全监督成绩查询,有官网建手机网站,wordpress人才市场说到程序中的延时#xff0c;你会想到怎么做#xff0c;新开一个线程#xff1f;如果我的程序只用单线程#xff0c;却又想让函数等上10秒才返回值#xff0c;而且还不能像使用Sleep函数那样不能处理其它消息呢#xff1f;我在这里把论坛里能见到的几种延时方式总结一下。… 说到程序中的延时你会想到怎么做新开一个线程如果我的程序只用单线程 却又想让函数等上10秒才返回值而且还不能像使用Sleep函数那样不能处理其它消息呢 我在这里把论坛里能见到的几种延时方式总结一下。 ------------------------------------------------------------------------------- 从陌生人的处理方式说起这是延时中时间跨度最大的单位至少在秒以上 http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id195559 见过不只一个人问起过。 其实估计陌生人是直接手写的这段代码不是从程序段中copy出来的有一些手误大家自己调整一下就行了 include COleDateTime start_time COleDateTime::GetCurrentTime(); COleDateTimeSpan end_time COleDateTime::GetCurrentTime() - start_time; while(end_time.GetTotalSeconds() 2) { MSG msg; GetMessage(msg,NULL,0,0); TranslateMessage(msg); DispatchMessage(msg); end_time COleDateTime::GetCurrentTime() - start_time; } 注意到我把原文中的 PreTranslateMessage(msg); 替换为了 TranslateMessage(msg); DispatchMessage(msg); 原因是可以不仅仅在MFC中使用而且 PreTranslateMessage有局限性而且可能会造成线程消息阻塞。 还有一点说明因为COleDateTimeSpan类的成员函数还有GetTotalMinutes、GetTotalHours、GetTotalDays 能够实现更大时间段的延时。 ----------------------------------------------------------------------- 往更小的时间跨度上说执行毫秒级的延时用GetTickCount就行 DWORD dwStart GetTickCount();DWORD dwEnd dwStart; do{ MSG msg; GetMessage(msg,NULL,0,0); TranslateMessage(msg); DispatchMessage(msg); dwEnd GetTickCount(); } while((dwEnd - dwStart) 2000); -------------------------------------------------------------------- 然后是微秒级延时 LARGE_INTEGER litmp ; LONGLONG QPart1,QPart2 ; double d0; QueryPerformanceCounter(litmp) ; // 获得初始值QPart1 litmp.QuadPart ;while (d40)//你想要的时间{ QueryPerformanceCounter(litmp) ; QPart2 litmp.QuadPart ; d(double)(QPart2 - QPart1); } 出处http://community.csdn.net/Expert/TopicView1.asp?id2663023。 未做修改如果需要微秒级的延时中也处理消息请参照前例修改。 最后如果还不能满足那就去做时钟周期的延时吧 #define NOP_COUNT 3//需要自己根据NOP及LOOP的指令周期计算.__asm { MOV ECX, NOP_COUNTDELAY: NOP LOOP DELAY } 不过用VC做这个工作是不是有点……