VC函数中的延时操作

原创 2013年12月05日 17:02:58
说到程序中的延时,你会想到怎么做,新开一个线程?如果我的程序只用单线程,

却又想让函数等上10秒才返回值,而且还不能像使用Sleep函数那样不能处理其它消息呢?

我在这里把论坛里能见到的几种延时方式总结一下。


-------------------------------------------------------------------------------
从陌生人的处理方式说起,这是延时中时间跨度最大的,单位至少在秒以上:
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195559
见过不只一个人问起过。

其实估计陌生人是直接手写的这段代码,不是从程序段中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 d=0;

QueryPerformanceCounter(&litmp) ; // 获得初始值QPart1 = litmp.QuadPart ;while (d<40)//你想要的时间{    QueryPerformanceCounter(&litmp) ;    

QPart2 = litmp.QuadPart ;   

 d=(double)(QPart2 - QPart1);

}

出处:http://community.csdn.net/Expert/TopicView1.asp?id=2663023。

未做修改,如果需要微秒级的延时中也处理消息,请参照前例修改。

最后,如果还不能满足,那就去做时钟周期的延时吧:

#define NOP_COUNT 3//需要自己根据NOP及LOOP的指令周期计算.__asm

 {  MOV ECX, NOP_COUNTDELAY: NOP  LOOP DELAY }

不过,用VC做这个工作是不是有点……
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

VC中使用Sleep函数的注意事项

VC中的Sleep函数在延时应用中很好用,比如通信程序中,一方需等待另一方若干个毫秒后再处理,或者在死循环中,让出CPU不至于资源占用100%等等; 但是,在界面操作中不要使用Sleep函数,比如按钮...
  • dijkstar
  • dijkstar
  • 2012年02月04日 20:13
  • 26923

VC中延迟函数执行

在编程过程中,有时候希望某个事件发生后,某个函数不是立即执行,而是延迟多少时间后再执行。延迟的方法有很多,最容易想到的是Sleep(),但是Sleep函数期间,窗口是死的,不接受外界任何操作,很明显不...

vc实现时间延时

vc实现时间延时 邵盛松2010年11月13日星期六 下载地址http://download.csdn.net/source/2829628 用Sleep函数延时,如何时间太长,程序就像无响应一样,采...

C++中时间延迟的几种方法

从论坛上转来的: (—)使用_sleep()函数  #include    using   namespace   std;  _sleep(5*1000);//延时5秒  ...
  • heycwn
  • heycwn
  • 2016年04月14日 11:14
  • 1501

C++中时间延迟的几种方法

从论坛上转来的: (—)使用_sleep()函数  #include    using   namespace   std;  _sleep(5*1000);//延时5秒  (...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

VC 微秒级延时函数

#include #include #include ULONG GetTimeDis(SYSTEMTIME first, SYSTEMTIME second)     {     re...
  • jk0o0
  • jk0o0
  • 2013年10月08日 14:34
  • 3454

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

C\C++中计时、延时函数

C\C++标准库中提供了两种计时函数clock()和time()。其用法如下: (1)clock()函数用法 void timeConsume() { double start,stop,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC函数中的延时操作
举报原因:
原因补充:

(最多只允许输入30个字)