首页 > Windows驱动开发 > DDK下的Sleep函数KeDelayExecutionThread

DDK下的Sleep函数KeDelayExecutionThread

非原创文章,本文摘自楚狂人《Windows驱动编程基础教程》

6.2 在线程中睡眠

许多读者一定使用过Sleep函数。这能使程序停下一段时间。许多需要连续、长期执行,但是又不希望占太多CPU使用率的任务,可以在中间加入睡眠。这样能使CPU使用率大大降低。即使睡眠的时间非常短(几十个毫秒)。
在驱动中也可以睡眠。使用到的内核函数的原型如下:

NTSTATUS 
  KeDelayExecutionThread(
    IN KPROCESSOR_MODE  WaitMode,
    IN BOOLEAN  Alertable,
    IN PLARGE_INTEGER  Interval
    );

这个函数的参数简单明了。WaitMode请总是填写KernelMode,因为现在是在内核编程中使用。Alertable表示是否允许线程报警(用于重新唤醒)。但是目前没有必要用到这么高级的功能,请总是填写FALSE。剩下的就是Interval了,表明要睡眠多久。

但是这个看似简单的参数说明起来却异常的复杂。为此作者建议读者使用下面简单的睡眠函数,这个函数可以指定睡眠多少毫秒,而没有必要自己去换算时间(这个函数中有睡眠时间的转换):

1
2
3
4
5
6
7
8
9
#define DELAY_ONE_MICROSECOND 	(-10)
#define DELAY_ONE_MILLISECOND	(DELAY_ONE_MICROSECOND*1000)
VOID MySleep(LONG msec)
{
	LARGE_INTEGER my_interval;
	my_interval.QuadPart = DELAY_ONE_MILLISECOND;
	my_interval.QuadPart *= msec;
	KeDelayExecutionThread(KernelMode,0,&my_interval);
}

当然要睡眠几秒也是可以的,1毫秒为千分之一秒。所以乘以1000就可以表示秒数。

在一个线程中用循环进行睡眠,也可以实现一个自己的定时器。考虑前面说的定时器的缺点:中断级较高,有一些事情不能做。在线程中用循环睡眠,每次睡眠结束之后调用自己的回调函数,也可以起到类似的效果。而且系统线程执行中是Passive中断级。睡眠之后依然是这个中断级,所以不像前面提到的定时器那样有限制。

请读者自己写出用线程+睡眠来实现定时器的例子。


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> DDK下的Sleep函数KeDelayExecutionThread
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: Windows驱动开发 标签: , ,
  1. 本文目前尚无任何评论.