CSDN=>FAQ=>FAQ 展示
  • 问题内容:VC函数中遇到延时操作的问题该如何解决?
  • 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5325062
  • 所属论坛:网络编程     审核组:VC/MFC
  • 提问者:yanglilibaobao     解决者:chair3
  • 感谢:huanyun lidongri syy64 lfchen handsomerun i_love_pc tomtom123 chair3 kuanghanli yjgx007
  • 关键字:VC/MFC 网络编程 start
  • 答案:

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

      几种延时方式总结如下:

      延时中时间跨度最大的,单位至少在秒以上:

      #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);
      }

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

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

      __asm 
      {
       MOV ECX, NOP_COUNT
       DELAY: NOP
       LOOP DELAY
      }


    转http://develop.csai.cn/c/200611071031341789.htm

    ---------------------------------------------------------------

    呵呵 知识贴啊?
    ---------------------------------------------------------------

    恩,又学到东西了
    谢谢楼主
    ---------------------------------------------------------------

    mark
    ---------------------------------------------------------------

    支持
    ---------------------------------------------------------------

    做个记号了!!
    ---------------------------------------------------------------

    没看明白,接分
    ---------------------------------------------------------------

    mark
    ---------------------------------------------------------------

    用个定时器或许会更好理解一些。

    在定时器触发的时候,立刻杀死该定时器。确保定时器只存在一次。

    Only建议
    ---------------------------------------------------------------

    很好的贴!
    ---------------------------------------------------------------

    LZ忘了一个

    SetWaitableTimer

  • 评价: 有价值 给朵鲜花(2) 无价值 扔个鸡蛋(1)
相关FAQ
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo