<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
关于在VC中时间函数的事业问题在论坛有不少的帖子讨论,下面结合讨论结果和相关的知识做个总结。
先从一个如何在程序中延时的问题谈起,延时的方法有
方法一:
使用sleep函数,它的最小单位是1ms,如延时2秒,用sleep(2000)。
方法二:
使用sleep函数的不利处在于期间不能处理其他的消息,如果时间太长,就好象死机一样,所以我们利用
COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现延时:
COleDateTime start_time = COleDateTime::GetCurrentTime();
COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;
While(end_time.GetTotalSeconds() {
MSG? msg;
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
DispatchMessage(&msg);
End_time = ColeDateTime::GetCurrentTime-start_time;
}//这样在延时的时候我们也能够处理其他的消息。
方法三:
可以采用GetTickCount()函数,该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔。
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do
{
MSG? msg;?
GetMessage(&msg,NULL,0,0);?
TranslateMessage(&msg);
DispatchMessage(&msg);
dwEnd = GetTickCount();?
} while((dwEnd - dwStart)? 上面的方法在延时的精确度上,很多时候不能满足我们的要求,下面是一种更精确的微秒级延时:
LARGE_INTEGER litmp ;
LONGLONG QPart1,QPart2 ;
double d=0;
QueryPerformanceCounter(&litmp) ;
// 获得初始值
QPart1 = litmp.QuadPart ;
while (d{
QueryPerformanceCounter(&litmp) ;
QPart2 = litmp.QuadPart ;
d=(double)(QPart2 - QPart1);
}
再看看仅供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。函数的原形是:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
typeef union _ LARGE_INTEGER
{
struct
{
DWORD LowPart;
LONG? HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。测试函数SLEEP(100)的精确持续时间方法:
LARGE_INTEGER litmp;
LONGLONG qt1,qt2;
double dft,dff,dfm;
QueryPerformanceFrequency(&litmp);//获得时钟频率
dff=(double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);//获得初始值
qt1=litmp.QuadPart;Sleep(100);
QueryPerformanceCounter(&litmp);//获得终止值
qt2=litmp.QuadPart;
dfm=(double)(qt2-qt1);
dft=dfm/dff;//获得对应的时间值
需要注意的是DFT计算的结果单位是秒。
参考连接:
http://dev.csdn.net/develop/article/31/31188.shtm
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195559
分享到:
相关推荐
关于DLLMAIN()入口函数的讨论,是讨论关于DLLMAIN()这个DLL入口函数的重要性和必要性的问题,我用VS2005列举了两个例子供大家参考.同时讨论了VC的约定的重要性,我在写这两个例子的时候就遇到同样的问题,用了一个上午的...
本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理; 2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制; 3. 熟悉OOP理论和技术; ...
以前讨论了由分立元器件或局部集成器件组成的正弦波和非正弦波信号产生电路,下面将目前用得较多的集成函数发生器8038作简单介绍。 1.8038的工作原理 由手册和有关资料可看出,8038由恒流源I1、I2,电压比较器C1...
日后合作为自行组织,在合作前必须统一我们的用语用词,定期发布自己在编写过程中所用到的词汇供大家讨论和参考。在互相交换代码模块时就不用大的修改。 3。工程的划分? 你参与了那个部分的建设,可以...
(11)日期和时间函数 用于日期,时间转换操作。 (12)进程控制函数 用于进程管理和控制。 (13)其它函数 用于其它各种功能。 以上各类函数不仅数量多,而且有的还需要硬件知识才会使用,因此要想全部掌握则...
节省用户的运算时间和内存要求。Math-Tools公司利用Matcom技术编写了Mideva工具软件,它可 以借用C++编译器将Matlab下的M文件转换为可被VisualBasic、Exe-cl以及Dephi调用的DLL(动态 链接库),亦可编译成独立的标准可...
2. 此外GetProcAddress是直接在.dll文件中寻找同名函数,如果DLL中的Test函数是个C++函数,那么由于在.dll文件中的实际文件名会被修饰(具体被修饰的规则可参考函数调用约定详解或者使用VC自带的Depends.exe查看),...
2. 帧函数(Frame Function)是一个用户定义的函数,每一帧时间,它会被HGE Engi ne 调用一次,函数返回true,则调用停止: bool FrameFunc() { if (hge->Input_GetKeyState(HGEK_ESCAPE)) { return true; } return ...
Oracle中PL/SQL单行函数和组函数详解 mssql+oracle Oracle编程的编码规范及命名规则 Oracle数据库字典介绍 0RACLE的字段类型 事务 CMT DEMO(容器管理事务演示) 事务隔离性的一些基础知识 在组件之间实现事务和异步...
3.1.1 vc中应用mscomm控件编程步骤 46 3.1.2 mscomm控件串行通信处理方式 47 3.1.3 mscomm 控件的属性说明 48 3.1.4 mscomm控件错误信息 55 3.2 使用mscomm控件的几个疑难问题 56 3.2.1 使用variant 和...
14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 深入了解 C#.174 第十五章 接 口 .174 15.1 组件编程技术 .174 15.2 接 口 定 义 .177 15.3 接口的成员 .178 15.4 接口的实现 .182 ...
就不安装也不删除,跟鸽子一个原理,我是靠字串区别的 2008/3/2 06:35 : 本着我们红狼写gh0st的初衷,一个共享,免费,的软件,到今天为止,算是对大家一个交代,新版本开发中,经小组内部讨论将此版本开源..装上VC6,打造...