Программирование драйверов Windows


Интервалы ожидания для отдельного потока


Достаточно часто встречаются ситуации, когда отдельно взятый поток вынужден откладывать продолжение своей работы на более поздний срок. Например, поток, занимающийся периодическим опросом устройства (если с этим устройством невозможно работать через механизм прерываний), должен задерживать свою работу каким-нибудь способом, более приемлемым, нежели цикл for с настраиваемым числом проходов.

Поток, который желает приостановить свою работу на время до 50 мкс, может использовать вызов KeStallExecutionProcessor.

Таблица 10.7. Прототип вызова KeStallExecutionProcessor

VOID KeStallExecutionProcessor IRQL == любой
Параметры Останавливает работу на указанный интервал, независимо от производительности процессора
IN ULONG IntervalCount Время задержки в 1 мкс интервалах
Возвращаемое значение void

В случае, если устройство должно опрашиваться быстро, но все-таки с интервалом более чем 50 мкс, драйвер должен использовать несколько программных потоков, о чем речь пойдёт далее.

Более сложным является вызов KeDelayExecutionThread (таблица 10.8). Он удаляет программный поток из очереди "ready to run", следовательно, не мешает выполнению других потоков, готовых к работе. Минимальный временной интервал определяемой им задержки составляет 100 нс.

Рекомендуемые для драйверов значения WaitMode=KernelMode

и Alertable=FALSE ограничивают применимость вызова KeDelayExecutionThread кодом системных потоков, созданных самим драйвером, и кодом процедур инициализации и завершения работы драйвера (то есть работающего заведомо вне пользовательского контекста).

Таблица 10.8. Прототип вызова KeDelayExecutionThread

NTSTATUS KeDelayExecutionThread IRQL == PASSIVE_LEVEL
Параметры Останавливает работу на указанный интервал, независимо от производительности процессора
IN KPROCESSOR_MODE WaitMode Для драйверов: KernelMode
IN BOOLEAN Alertable Для драйверов: FALSE

IN PLARGE_INTEGER TimeInterval Время задержки в 100нс интервалах
Возвращаемое значение STATUS_SUCCESS &#8212 ожидание завершено
<


Начало  Назад  Вперед