Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры ОС1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.61 Mб
Скачать

24. Таймеры ожидания в ос Windows и понятие apc

Эти таймеры используются для выполнения определённых действий в заданное время или через определённый интервал времени.

Таймер ожидания является таким же объектом синхронизации как, например семафор, т.е. его можно дождаться с помощью ф-ций WaitFor. Таймер переходит в сигнальное состояние по достижению заданной точки во времени. Этими таймерами следует пользоваться с большей предпочтительностью, нежели оконным сообщением WM_TIMER.

Ждущий таймер создается с помощью функции CreateWaitableTimer.

HANDLE CreateWaitableTimer(

LPSECURITY_ATTRIBUTES psa,

BOOL bManualReset,

LPCTSTR pTimerName); // имя таймера

HANDLE OpenWaitableTimer(

DWORD dwDesiredAccess, // описатель таймера

BOOL bInhemtHandle, //время срабатывания

LPCTSTR pTimerName);

Положительное значение времени срабатывания даёт абсолютное время, отрицательное даёт относительное время.

Задание времени срабатывания таймера производится с помощью функции SetWaitableTimer.

Если период срабатывания таймера в функции SetWaitableTimer равен нулю, то таймер сработает лишь однажды.

TimerAPCProc(

LPVOID pArgCompletion,

DWORD dTimerLowValue, //время

DWORD dTimerLowValue); //время

Ждущие таймеры как и события бывают с ручным сбросом и синхронизирующие. Таймеры с ручным сбросом освобождают все ждущие их нити, синхронизирующие только одну.

Время измеряется в ста наносекундных интервалах начиная с 1 января 1601 года. SystemTimeToFileTime.

Структура SystemTime содержит значения: год, месяц, день, минута, секунда.

Структура FILETIME – это 8-ми байтовое целое.

Для того чтобы перевести время из текущего часового пояса в значение по Гринвичу используется ф-ция: LocalFileTimeToFileTime

Ожидание срабатывания таймера можно производить с помощью ф-ций группы WaitFor, другой способ задания APC ф-ций. Не рекомендуется делать и то и другое одновременно, поскольку если вы ждёте таймер в тревожном состоянии с помощью ф-ций с суффиксом Ex, то после срабатывания таймера произойдёт выход из ф-ции ожидания, а когда выйдете из ф-ции, то нить перестанет быть в тревожном состоянии и APC ф-ция не вызовется.

APC (Asynchronous Procedure Call) – асинхронный вызов процедуры.

С помощью ждущих таймеров можно легко программировать максимальное время ожидания поступления данных.

Существуют спец. ф-ции отмены ожидания: CancelWaitableTimer

25. Структурная обработка исключений.

Структурная обработка исключений позволяет при возникновении ошибки в программе, обработать эту ошибку и продолжить выполнение программы. Язык программирования С++ позволяет проводить такую обработку с помощью блоков try и catch. Это весьма гибкий механизм обработки исключительных ситуаций.

Его описание можно найти в любой книге по С++. Microsoft помимо стандартного обработчика исключительных ситуаций С++ заложила в свой компилятор еще один механизм обработки завершения исключений. Это пара блоков:

__try __try

__finale __except

Первый блок предназначен для обработки завершающего блока, а второй для обработки исключений.

В блоке __try производится стандартное выполнение программы. Блок __finaly выполняется всегда после блока __try. Блок __except выполняется при возникновении исключения. Любое количество блоков __try может быть вложено один в другой.

Однако каждый должен завершаться либо блоком finaly либо блоков except.

__try {

if (bNeedtoOut)

__leave;

return;

}

__finaly {

if (AbnormalTermination()) {}

else {}

}

__try {

//защищенный блок}

__except (

//фильтр исключений)

{

//обработка исключений

}

Фильтр исключений – это 1 оператор. Результатом работы этого оператора могут быть три значения 1, 0, -1.

  1. 1 – EXCEPTION_EXECUTE_HANDLER

ошибка распознана. Последствия ошибки будут ликвидированы в блоке except. Затем программа перейдет на оператор, следующий за блоком except.

  1. 0 – EXCEPTION_CONTINUE_SEARCH

Ошибка не распознана. Необходимо перейти на следующий вверх блок except.

  1. -1 – EXCEPTION_CONTINUE_EXECUTION

Ошибка распознана и устранена. Необходимо вернуться на ту же самую машинную команду, которая вызвала ошибку.

__try {

__try {}

__except(0) {}

}

__except (1) {}

Если такого обработчика нет, то вызвать стандартный обработчик исключений ОС, который аварийно завершит программу.

Стек обработчиков исключений для каждой нити свой. Текущий обработчик исключений находится по адресу fs:0 (сегментный регистр). В ОС Windows сегментный регистр fs не указывает на общее адресное пространство процессов. Он указывает на небольшой блок памяти, выделяемый ОС отдельно для каждой нити. Этот блок называется Tread Environment Block (TEB) и он не документирован. По адресу 0 в этом блоке лежит адрес текущего обработчика исключений, который, в свою очередь, уже относится к адресному пространству процесса.

При входе в блок try{} предыдущее обращение к адресу обработчика запоминается в стеке нити и на его место записывается новое значение (адрес блока try{}). Посмотреть параметры исключения можно внутри фильтра исключений EXCEPTION_POINTER.

GetExceptionInformation ();

typedef struct {

PEXCEPTION_RECORD ExceptionRecord;

PCONTEXT ContextRecord;

} EXCEPTION_POINTER;

typedef struct _EXCEPTION_RECORD{

ULOG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETRS];

} EXEPTION_RECORD, *PEXCEPTION_RECORD;

ContextRecord – содержимое контекста регистров ЦП при исключении, который использовала данная нить.

Исключение можно вызвать намеренно. Для этого существует функция RaiseException