谁用过CreateSystemTimer这样的函数?

stevecrisewu 2005-03-30 01:38:47
在Windows的SYSTEM.DRV驱动程序中提供了几个鲜为人知的系统计时器函数(这几个函

数未写入Windows.h中,但却被SYSTEM.DRV输出了),这几个函数可以帮助我们获得精

确计时器服务,即系统计时器。这其中最重要的是CreateSystemTimer()和

KillSystemTimer(),这两个函数允许我们安装异步计时器的回调函数(Callback),有

些类似于在DOS环境中截取INT 8中断处理程序。这个回调是真正异步的,完全避开了

Windows的消息工具,因而具有重要意义。事实上,Microsoft Excel和Windows COMM

驱动程序都用到了系统计时器,而由SetTimer()安装的一般计时器也是由系统计时器

来实现的。

这两个函数的原型如下:

WORD CreateSystemTimer(wMsecInterval,lpfnTimerProc);

WORD wMsecInterval; /*以毫秒为单位的时间间隔,系统将每隔此时间调用一 次回调函数

*/

FARPROC lpfn TimerProc;/*指向回调函数的指针*/

WORD KillSystemTimer(hTimer);

WORD hTimer;/*欲释放的系统计时器句柄*/

 

其中,CreateSystemTimer()用于安装一个系统计时器回调函数,SYSTEM INT8处理程序将

按wMsecInterval指定的时时间间隔调用此回调函数。当然,这个指定的回调频率也是有

限的,同SetTimer()一样,每秒钟调用回调函数次数不能超过18.2次,即wMsecInterval>

55。该函数返回一个系统计时器句柄。若安装失败,则返回NULL。KillSystemTimer()则

用于撤销一个已安装的系统计时器hTimer。若成功,则返回;出错则返回传给它的参数

hTimer。

 

3.使用系统计时器应注意的问题。

系统计时器回调函数虽然不是中断处理程序,但由于它直接被中断处理程序调用,因此也

必将它看作中断代码。这也就决定了在使用过程中必须注意以下几个问题:

(1).在回函数中应包括尽量少的代码,以使得频繁回调的该函数不至于占用太多的CPU时

间。一般情况下,系统计时器总是用来监视或设置某些变量的值。

(2).由于该回调函数属于中断代码,因此大多数Windows API函数调用都不适用了,只有

几个简单的函数仍然可以使用,如PostMessage(),GetCurrentTask()和MessageBeep()

等。

(3).由于该回调函数由中断处理程序直接调用,因此该函数必须放在一个固定的代码段

中,并且调用前必须装载DS寄存器,这可由形实替换函数MakeProcInstance()来做到。

另外,由于这两个函数在Windows.h中没有给出(即Windows缺省输入库不含此两函数),因

此在调用之前必须进行链接。这可采用运行时动态链接,即通过GetModuleHandle()和

GetProcAddress()来链接;也可在程序模块定义文件中用IMPORTS语句来引入,此时则必

须在程序源文件中说明CreateSystemTimer()和KillSystemTimer()为外部函数。本文给出

的例子采用第二种方案。
...全文
140 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowCan 2005-04-01
  • 打赏
  • 举报
回复
Win95/NT好像已经没有这个了。
stevecrisewu 2005-03-31
  • 打赏
  • 举报
回复
在顶
stevecrisewu 2005-03-30
  • 打赏
  • 举报
回复
相关资料少只有少阿
najzni 2005-03-30
  • 打赏
  • 举报
回复
gz
oyljerry 2005-03-30
  • 打赏
  • 举报
回复
gz
stevecrisewu 2005-03-30
  • 打赏
  • 举报
回复
我紧

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧