在MS VC++下实现微秒级精度定时(注意后面我附的自己的源程序,VC6.0运行通过!!!)
来源:互联网 发布:美工电脑固态 编辑:程序博客网 时间:2024/06/06 14:09
在MS VC++下实现微秒级精度定时
要实现微秒级精度要用到下面两个函数:
BOOL QueryPerformanceFrequency (LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
编程时需要包含:Windows.h Kernel32.lib
上述两个函数的参数的数据类型LARGE_INTEGER既可以是一个8字节长的整型数,
也可以是两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而
定。该类型的定义如下:
typedef union _LARGE_INTEGER
{
struct{
DWORD LowPart ; // 4字节整型数
LONG HighPart ; // 4字节整型数
};
LONG QuadPart ; // 8字节整型数
} LARGE_INTEGER ;
1、首先调用QueryPerformanceFrequency()函数取得高精度运行计数器的频率f,单位是每秒多少次(n/s),此数一般很大;
2、在需要定时的代码的两端分别调用QueryPerformanceCounter()以取得高精度运行计数器的数值n1、n2,两次数值的差值通过f换算成时间间隔,t=(n2-n1)/f获得的t单位为秒.
实现微秒精度定时器:
LARGE_INTEGER PT_litmp;
LONGLONG PT_QPart1,PT_QPart2;
double PT_dfMinus,PT_dfFreq,PT_dfTim;
//(以上的LARGE_INTEGER 和LONGLONG数据结构你查msdn)
QueryPerformanceFrequency(&PT_litmp);
PT_dfFreq=(double)PT_litmp.QuadPart; //获得系统的主频
QueryPerformanceCounter(&PT_litmp);
PT_QPart1=PT_litmp.QuadPart; //获得起始的值
do{
QueryPerformanceCounter(&PT_litmp);
PT_QPart2=PT_litmp.QuadPart; //获得结束计数
PT_dfMinus=(double)(PT_QPart2-PT_QPart1);
PT_dfTim=PT_dfMinus/PT_dfFreq; //计算出程序运行的时间,单位s
}while(PT_dfTim*1000000<1000); //当程序运行到1000微s时退出while循环
VC++7.0下实现检测一个过程或函数耗费的时间:
LARGE_INTEGER PT_litmp;
LONGLONG PT_QPart1,PT_QPart2;
double PT_dfMinus,PT_dfFreq,PT_dfTim;
QueryPerformanceFrequency(&PT_litmp);
PT_dfFreq=(double)PT_litmp.QuadPart; //获得系统的主频
QueryPerformanceCounter(&PT_litmp);
PT_QPart1=PT_litmp.QuadPart; //获得起始的值
//这里添加要检测耗时多少的过程
QueryPerformanceCounter(&PT_litmp);
PT_QPart2=PT_litmp.QuadPart; //获得结束计数
PT_dfMinus=(double)(PT_QPart2-PT_QPart1);
PT_dfTim=PT_dfMinus/PT_dfFreq; //计算出程序运行的时间,单位s
PT_dfTim*=1000; //换算为毫秒
// PT_dfTim*=1000000;//换算为微秒
//以下代码将时间转化为字符串并显示出来
char timestring[100];
sprintf(timestring,"%f ms",PT_dfTim);
timestring[99]='0';
ID3DXFont* font=0;
D3DXFONT_DESC lf;
ZeroMemory(&lf,sizeof(D3DXFONT_DESC));
lf.Height=25;
lf.Weight=12;
lf.Weight=500;
lf.Italic=false;
lf.CharSet=DEFAULT_CHARSET;
strcpy(lf.FaceName,"Times New Roman");
D3DXCreateFontIndirect(Device,&lf,&font);
RECT rect;
rect.top=0;
rect.left=0;
rect.bottom=20;
rect.right=500;
font->DrawText(NULL,timestring,-1,&rect,DT_LEFT,D3DCOLOR_ARGB(255,0,0,0));
///////////////////////////////////////////////////////自己的程序:
void CWEIMIAOView::OnDraw(CDC* pDC)
{
CWEIMIAODoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
LARGE_INTEGER L;
LONGLONG f;
INT64 t0;
LONGLONG t1;
INT64 time;
QueryPerformanceFrequency(&L);
f=L.QuadPart;
int i;
int a;
CString str;
QueryPerformanceCounter(&L);
t0=L.QuadPart;
for(i=0;i<10000;i++)
{
a=i/1234;
}
QueryPerformanceCounter(&L);
t1=L.QuadPart;
float t=(t1-t0)/f;
str.Format("f:%I64d",f);
pDC->TextOut(0,0,str);
str.Format("t0:%I64d",t0);
pDC->TextOut(0,20,str);
str.Format("t1:%I64d",t1);
pDC->TextOut(0,40,str);
time=1000*(t1-t0)*1000/f;
str.Format("10000次整数除法运算所需时间:%I64d微秒。",time);
pDC->TextOut(0,60,str);
}
- 在MS VC++下实现微秒级精度定时(注意后面我附的自己的源程序,VC6.0运行通过!!!)
- 在MS VC++下实现微秒级精度定时
- linux下获取微秒级精度的时间
- VC++实现微秒级的精确定时器
- VC++实现微秒级的精确定时器
- windows下实现微秒级的延时
- windows下实现微秒级的延时
- 查找文件夹中的所有文件及子文件夹的方法,附源程序,VC7.1下编译运行通过
- 查找文件夹中的所有文件及子文件夹的方法,附源程序,VC7.1下编译运行通过
- 在程序中获得驱动器盘符的方法,附源程序,可在VC7.1下编译运行
- 在程序中获得驱动器盘符的方法,附源程序,可在VC7.1下编译运行
- 用T1定时,在P1.0和P1.1 引脚分别输出周期为2ms和500微秒的方波
- 求助:我的VC6.0程序怎么在xp下不能运行
- win8下安装VC++6.0 在VC6.0下 多线程的实现
- 一个微秒级的定时函数
- 在VC6.0下创建自己的C函数库
- 一种制作微秒级精度定时器的方法(转贴)
- 一种制作微秒级精度定时器的方法(转贴)
- JAVA中限制文本框输入长度的办法
- UITableView Class Reference
- 观察者模式 ObserverPattern
- 网页标准之争
- 什么是 GUID?(转载)
- 在MS VC++下实现微秒级精度定时(注意后面我附的自己的源程序,VC6.0运行通过!!!)
- Visual C++常用数据类型转换详解
- 原型模式 PrototypePattern
- Java 记事本代码
- 职责链模式 ResponsibilityChainPattern
- POJ 1316 self numbers 整数各位相加处理
- POJ 2699 The Maximum Number of Strong Kings
- pthread多线程编程
- getSystemService