Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / Презентация. Механизмы ядра. Часть 2.pptx
Скачиваний:
55
Добавлен:
20.09.2019
Размер:
4.94 Mб
Скачать

СПбГУТ им. проф. Бонч- Бруевича )))

Механизмы ядра. Часть 2

Алгоритмические основы программной инженерии Ерофеев С. А.

Коваленко Л. А.

План

1.Таймер ожидания (Waitable Timer).

2.Канал (Pipe).

Используемый софт

1.Используемые языки: C (Си).

2.Стандарт языка Си: C89 (ISO C90).

3.Среда разработки: Dev-C++ 5.11 (2015).

4.Компилятор: GNU C89 (tdm64-1) version 5.1.0 (x86_64-w64-mingw32).

5.Используемые заголовочные файлы: windows.h, stdio.h, string.h, locale.h.

Таймер ожидания (Waitable Timer)

Таймер ожидания

Таймер ожидания — объект, который самостоятельно переходит в сигнальное состояние в определенное время или через регулярный промежуток времени.

Абсолютный

Относительный

таймер

таймер

Положительное

Отрицательное

значение lpDueTime

значение lpDueTime

Помимо этого, таймер может иметь период срабатывания.

Создание абсолютного таймера

ожидания

Абсолютный таймер, который срабатывает 12 мая 2019 г. в 19:20, а затем каждую минуту.

#include <stdio.h>

#include <windows.h> /* Подключаем */

/* Функция таймера с 3-мя параметрами: 1 — произвольный аргумент, 2 и 3 — время, в которое таймер сработал */

void CALLBACK SpecFunc(void *lpArg, unsigned long dwTimerLowValue, unsigned long dwTimerHighValue) { printf("Time!\n"); /* Выводим сообщение */

MessageBeep(0); /* Свистим */

}

int main() { int k;

HANDLE hColTimer; /* Создаем дескриптор объекта */ SYSTEMTIME ColTime; /* Создаем структуру «дата и время» */ FILETIME ftLocal_ColTime, ftUTC_ColTime;

/* Структура FILETIME содержит 64-разрядное значение (два поля типа DWORD low и high) число интервалов в 100 наносекунд с 1 января 1601 года (UTC).*/

LARGE_INTEGER liUTC_ColTime; /* 64-битное значение */ BOOL bSuccess;

Создание абсолютного таймера ожидания

hColTimer = CreateWaitableTimer(NULL, FALSE, "MyTimer"); /* Создаем именованный таймер */ if (hColTimer != NULL) { /* Если успешно */

ColTime.wYear = 2019; /* Год 2019 */ ColTime.wMonth = 5; /* Месяц Май */ ColTime.wDayOfWeek = 0; /* День недели неважен */ ColTime.wDay = 12; /* День месяца 12 */ ColTime.wHour = 19; /* Час 19 */

ColTime.wMinute = 20; /* Минуты 20 */ ColTime.wSecond = 0; /* Секунды 0 */ ColTime.wMilliseconds = 0; /* Миллисекунды 0 */

/* Преобразуем системное время в формат времени файла.

Системное время основано на всемирном координированном времени (UTC). */ SystemTimeToFileTime(&ColTime, &ftLocal_ColTime);

/* Преобразуем время локального файла в время файла

Ничего полезного

на основе всемирного координированного времени (UTC). */

Аргумент

LocalFileTimeToFileTime(&ftLocal_ColTime, &ftUTC_ColTime);

liUTC_ColTime.LowPart = ftUTC_ColTime.dwLowDateTime;

для функции

liUTC_ColTime.HighPart = ftUTC_ColTime.dwHighDateTime;

 

/* Активируем таймер */

 

bSuccess = SetWaitableTimer(hColTimer, &liUTC_ColTime, 60000, &SpecFunc, NULL, FALSE); /* 60000 — 60 секунд, SpecFunc — наша функция */

Создание абсолютного таймера

ожидания

 

TRUE: ждать время INFINITE ИЛИ

 

срабатывание таймера

 

FALSE: ждать только время INFINITE

Первое срабатывание

if (bSuccess) { /* Если успешный запуск, то */

/* 5 раз ждем срабатывания функции */

Через 1 минуту

for (k = 1; k <= 5; k += 1)

+ 1 минута

+ 1 минута

SleepEx(INFINITE, TRUE); /* Ждем */

+ 1 минута

}

 

else { /* Если ошибка, то */

 

printf("SetWaitableTimer failed with error %d\n", GetLastError());

}

}

else /* Если ошибка, то */

printf("CreateWaitableTimer failed with error %d\n", GetLastError()); CloseHandle(hColTimer); /* Обязательно закрываем дескриптор */ getchar(); getchar(); /* Ввод символов — пауза перед выходом */

return 0;

}

Отображение информации в Process Explorer

Наш таймер

Создание относительного таймера

ожидания

Относительный таймер, который срабатывает спустя 5 секунд 3 раза подряд с интервалом в 1

#includeсекунду,<stdio.h>а затем завершается.

#include <windows.h>

void CALLBACK SpecFunc(void *lpArg, unsigned long dwTimerLowValue, unsigned long dwTimerHighValue) {

printf("Time!\n"); /* Выводим сообщение */ MessageBeep(0); /* Свистим */

}

int main() { int i;

HANDLE hColTimer; /* Создаем дескриптор объекта */

const unsigned long long quantum = 10 * 1000 * 1000; /* 1 квант */ LARGE_INTEGER liUTC_ColTime;

liUTC_ColTime.QuadPart = -5 * quantum; /* Минус означает относительное время, 5 секунд */ BOOL bSuccess;

hColTimer = CreateWaitableTimer(NULL, TRUE, NULL); /* Создаем безымянный таймер */