- “定时器”与“时钟”的联系:
很多读者一开始看到“定时器”这个词,往往就联想到时钟,但是,经过我们前一章的探索,可以发现,“定时器”这种特征明显不能用来构造时钟,定时器用于时钟程序只能是用于定时器刷新屏幕这个功能上,要得到系统的时间还是要靠别的方法。 - Windows时间的获取和设置
- Windows获取系统时间的函数:
- 它们之间区别:
- GetLocalTime 返回 当前时间。
- GetSystemTime 返回 当前的格林威治标准时间。
- 使用方法:
- 这两个时间返回的时间数据包括 年、月、日、时、分、秒、毫秒、以及星期,由于数据比小朵,所以无法放在 eax 中返回,应用程序需要先设置一个 SYSTEMTIME 结构的缓冲区,并将缓冲区地址 lpSystemTime 当参数传递给函数,函数会把时间数据返回到这个缓冲区中。
- SYSTEMTIME结构如下如:
- 数据长度转换:
需要注意的是,结构中的字段全部是 word 类型的,而由于win32程序中用的往往是 dword 型变量,所以在使用这些数据之前往往要先把它们转换成 dword类型,用 movzx指令就可以很方便地完成这个工作。
- 它们之间区别:
- 设置系统时间:
- 设置系统时间使用的函数:
- 使用说明:同样,SetLocalTime中的参数代表本地时间,SetSystemTime中的参数代表格林威治标准时间,在调用函数之前,要把需要设置的时间放到一个SYSTEMTIME 结构中并把其地址当作参数传递给 Windows。
- 设置系统时间使用的函数:
- Windows获取系统时间的函数:
- 计算时间间隔:
- 初步介绍:
在实际过程中,经常要计算距离上次的时间点已经过去了多少时间,当然,这个数据可以通过两次调用 GetLocalTime函数并将两次的时间值相减来得到,唯一的麻烦就是计算的过程比较复杂,因为返回数据有 年,月,日····,将两个时间相减要涉及借位相减等问题。 - 时间戳函数 GetTickCount :
- 介绍:
使用本地时间戳函数 GetTickCount 可以方便地完成这个功能,GetTickCount 函数返回的是Windows本次启动以来的ms数,得到的时间数值直接在eax中返回,这是一个32位的整数,所以,当Windows连续运行49.7天以后,计数器会清零并重新开始。 - GetTickCount 的使用:
在当前的windows系统下,其函数的精度是 10ms。
- 介绍:
- 高精度的计时器:
- 在Windows系统内部维护了一个高精度的计时器,计时的精度取决于计算机的硬件速度,用 QueryPerformanceFrequency 函数可以获取该计时器每秒钟的计数值:
- 位数转换:
- 由于计数值比较大,一个32位整数无法弄让,所以该函数的参数指向一个 qword,函数运行后在该qword中返回一个64位的值。
- 根据该技术值就可以计算出计时器的精度为 1 000 000 / dqFreq 微秒。当CPU 主频比较高的时候,计数器会比较大,意味着计数器的精度比较高。
- 这个由于我们很少用到,所以在这里只是简单提一下,当真正用到的时候再去查阅相关资料即可。
- 初步介绍:
06-07