-
问题内容: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)