- •СПбГУТ им. проф. Бонч- Бруевича )))
- •План
- •Используемый софт
- •Таймер ожидания (Waitable Timer)
- •Таймер ожидания
- •Создание абсолютного таймера
- •Создание абсолютного таймера ожидания
- •Создание абсолютного таймера
- •Отображение информации в Process Explorer
- •Создание относительного таймера
- •Создание относительного таймера ожидания
- •Канал (Pipe)
- •Канал
- •Функциональность двух типов каналов
- •Создание анонимного канала
- •Создание анонимного канала
- •Создание анонимного канала
- •Создание анонимного канала
- •Создание анонимного канала
- •Отображение информации в Process Explorer
- •Создание именованного канала
- •Создание именованного канала
- •Создание именованного канала
- •Отображение информации в Process Explorer
- •Литература
- •Используемая литература
- •FINAL
СПбГУТ им. проф. Бонч- Бруевича )))
Механизмы ядра. Часть 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); /* Создаем безымянный таймер */