c语言调用精确时间函数 c++精确时间( 五 )


//计算持续时间的长度
/* Date : 10/24/2007 */
/* Author: Eman Lee */
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int main(void)
{
time_t start,end;
start = time(NULL);
system("pause");
end = time(NULL);
printf("The pause used %f seconds. ",difftime(end,start));//-
system("pause");
return 0;
}
运行结果为:
请按任意键继续. . .
The pause used 2.000000 seconds.
请按任意键继续. . .
可以想像,暂停的时间并不那么巧是整整2秒钟 。其实,你将上面程序的带有“//-”注释的一行用下面的一行代码替换:
printf("The pause used %f seconds. ",end-start);
其运行结果是一样的 。
9. 分解时间转化为日历时间
这里说的分解时间就是以年、月、日、时、分、秒等分量保存的时间结构,在C/C++中是tm结构 。我们可以使用mktime()函数将用tm结构表示的时间转化为日历时间 。其函数原型如下:
time_t mktime(struct tm * timeptr);
其返回值就是转化后的日历时间 。这样我们就可以先制定一个分解时间,然后对这个时间进行操作了,下面的例子可以计算出1997年7月1日是星期几:
//计算出1997年7月1日是星期几
/* Date : 10/24/2007 */
/* Author: Eman Lee */
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int main(void)
{
struct tm time;
time_t t_of_day;
time.tm_year=1997-1900;
time.tm_mon=6;
time.tm_mday=1;
time.tm_hour=0;
time.tm_min=0;
time.tm_sec=1;
time.tm_isdst=0;
t_of_day=mktime(time);
printf(ctime(t_of_day));
return 0;
}
运行结果:
Tue Jul 01 00:00:01 1997
有了mktime()函数,是不是我们可以操作现在之前的任何时间呢?你可以通过这种办法算出1945年8月15号是星期几吗?答案是否定的 。因为这个时间在1970年1月1日之前,所以在大多数编译器中 , 这样的程序虽然可以编译通过,但运行时会异常终止 。
注:linux系统时间如果转换为 time_t 类型,都是从1970-01-01 08:00:00 开始计算
如何用C语言实现精确软件定时在精度要求较高的情况下 , 如要求误差不大于1ms时 , 可以利用GetTickCount()函数 。该函数的返回值是DWORD型 , 表示以ms为单位的计算机启动后经历的时间间隔 。下列的代码可以实现50ms的精确定时,其误差小于1ms 。
// 起始值和中止值
DWORD dwStart, dwStop ;
dwStop = GetTickCount();
while(TRUE) {
// 上一次的中止值变成新的起始值
dwStart = dwStop ;
// 此处添加相应控制语句
do
{
dwStop = GetTickCount() ;
}while(dwStop - 50dwStart) ;
}
微软公司在其多媒体Windows中提供了精确定时器的底层API支持 。利用多媒体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔内完成一个事件、函数或过程的调用 。利用多媒体定时器的基本功能,可以通过两种方法实现精确定时 。
1.使用timeGetTime()函数
该函数定时精度为ms级,返回从Windows启动开始所经过的时间 。由于使用该函数是通过查询的方式进行定时控制的 , 所以,应该建立定时循环来进行定时事件的控制 。
2. 使用timeSetEvent()函数
利用该函数可以实现周期性的函数调用 。函数的参数说明如下:
uDelay:延迟时间;
uResolution:时间精度,在Windows中缺省值为1ms;
lpFunction:回调函数,为用户自定义函数,定时调用;
dwUser:用户参数;
uFlags:标志参数;

推荐阅读