【第22期】观点:IT 行业加班,到底有没有价值?

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做这个工作是不是有点……
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

延时分析

FreeRTOS提供了两个系统延时函数:相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil()。相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指...

IOS中延时执行的几种方式的比较和汇总

转载自:http://blog.sina.com.cn/s/blog_8280f5ec0101k03c.html 本文列举了四种延时执行某函数的方法及其一些区别。假如延时1秒时间执行下面的方...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

单片机两大延时方法总结

实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。 1 ...

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

C++中时间延迟的几种方法 (—)使用_sleep()函数  #include    using   namespace   std;  _sleep(5*1000);//延...

C++ 程序延时处理的几种方法

(—)使用_sleep()函数  例如:_sleep(200);//延时200毫秒 (二)使用delay(int time)函数 (需要自己实现,编译器里面没有) /// @brief 程序延...

直播如何解决延时问题?

原文链接:http://mp.weixin.qq.com/s?__biz=MzA5Nzc4OTA1Mw==&mid=2659598371&idx=1&sn=b9e81fc19c36c0c2a29dc9...

MFC中程序的延时

在执行程序的过程中,可以根据不同的需求进行不同的延时操作,这里介绍两种方法,希望对大家有用! 1.Sleep(t);t的单位是毫秒; 但是在执行的过程中,整个程序会挂起来,停止执行; 2.tim...

MFC 程序的延时操作

具体实现的目标: 1、延迟要执行的操作 2、下次延时操作到来时,判断上一次的延时操作是否已经完成,      A:如果上一次操作还没开始做,结束上一次延时,本次延时开始;      B:如果上...

MFC 延时函数

1、使用Sleep()函数 2、获取时间差,小于给定时间差,执行循环 #include #include #include #include using namespace std; ...
  • Qyee16
  • Qyee16
  • 2013-04-21 00:58
  • 3062

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

从论坛上转来的: (—)使用_sleep()函数  #include    using   namespace   std;  _sleep(5*1000);//延时5秒  (...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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