VC函数中的延时操作

原创 2004年07月20日 13:42:00

        说到程序中的延时,你会想到怎么做,新开一个线程?如果我的程序只用单线程,却又想让函数等上10秒才返回值,而且还不能像使用Sleep函数那样不能处理其它消息呢?

        我在这里把论坛里能见到的几种延时方式总结一下。另外,主要是学习的别人的sources,版权不在我,如果本文对大家有用,请分别感谢文中的这些作者(CSDN上的ID):laiyiling(最熟悉的陌生人)QunKangLi(雾痕)tyzyx(炸平日本岛)

        从陌生人的处理方式说起,这是延时中时间跨度最大的,单位至少在秒以上:
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_COUNT
DELAY: NOP
  LOOP DELAY
}
不过,用VC做这个工作是不是有点……

VC++ Sleep函数原理及Sleep(0)的使用(文章较深入但通俗易懂)

我们可能经常会用到 Sleep 函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2012-12-16 3:37:40,如果我调用一下 Thre...
  • chinaeran
  • chinaeran
  • 2013年10月15日 17:38
  • 3281

VC++ 字符串操作学习总结

vc++中各种字符串(转载) http://www.cnblogs.com/tomin/archive/2008/12/28/1364097.html CString ,BSTR ,LPC...
  • bcbobo21cn
  • bcbobo21cn
  • 2017年04月05日 15:55
  • 1272

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

C\C++标准库中提供了两种计时函数clock()和time()。其用法如下: (1)clock()函数用法 void timeConsume() { double start,stop,...
  • keith_bb
  • keith_bb
  • 2016年11月06日 18:25
  • 10691

VC实现以微秒延时函数的程序源代码示例

  • 2012年04月22日 07:56
  • 1KB
  • 下载

VC延时函数

VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作。  方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。首先调用函数...
  • jhh_move_on
  • jhh_move_on
  • 2012年10月16日 13:53
  • 538

VC++延时函数

VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作。 方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。首先调用函数...
  • jobsss
  • jobsss
  • 2012年09月04日 10:34
  • 1067

七种VC延时方式

方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。首先调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔。然后在应用程序中增加...
  • vinglemar
  • vinglemar
  • 2011年01月26日 21:35
  • 599

VC++ mscomm控件接收字符大于8字节的解决方法(延时)

有很多人遇到串口事件触发(我理解是中断)时只能接收8个字节,这是由于串行通信相对于并行通信时间比较长,所以传输时间必须要考虑在内,有的人的解决方法是把SetRThreshold()内的值设置大一点,但...
  • qingchuan2083
  • qingchuan2083
  • 2012年07月12日 15:18
  • 1989

STM32的GPIO输出-LED闪灯(软件延时方式)(库函数)

  • 2017年11月28日 17:42
  • 38KB
  • 下载

单片机c语言中nop函数的使用方法和延时计算

  • 2018年01月05日 16:41
  • 46KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC函数中的延时操作
举报原因:
原因补充:

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