Впрочем, этот пример элегантным уже не назовешь, т.к.
использование COM-порта дает возможность избавиться от периодического опроса, используя асинхронную работу через WaitCommEvent и WaitForMultipleObjects.
Ниже приведен код примера. Для пояснения сути
происходящего код обильно прокомментирован. Но все-таки обращу внимание на
некоторые нюансы:
WaitForMultipleObjects ждет бесконечно. Никаких
периодических опросов — значит и никакого потребления ресурсов. Всё реализовано
на событиях.
Нет необходимости в TerminateThread для
принудительного прекращения выполнения потока. Выполнение может быть
«культурно» завершено в любой момент. Для этого используется отдельное событие.
Простая реализация неблокирующей задержки для
подавления дребезга. Поскольку периодический опрос мы не применяем, то, чтобы
избавиться от ложных срабатываний программным путем, нужно подождать несколько
десятков миллисекунд, и если состояние за это время не изменилось, то
замыкание/размыкание цепи состоялось. В качестве таймера используется
WaitableTimer. Обратите внимание на его теоретическую точность.
Ключевой метод
procedure
TComWatchdogThread.Execute;
var
// структура, используемая Win32 для
хранения внутренней информации при
// асинхронной работе. Ничего кроме поля
hEvent нам от неё не требуется
eOverlapped: TOverlapped;
// запрос ожидания асинхронного события
изменения состояния порта
//...........................................................................
procedure InitWaitCommEvent;
var
eEventMask: DWORD;
begin
// ошибки ERROR_IO_PENDING нужно просто
игнорировать - их наличие означает
// только то, что последняя операция с
портом ещё не завершена. Рекомендуем скачать другие рефераты по теме: экзамены, реферат на тему мир.
Предыдущая страница реферата | 1
2
3
4
5
6 | Следующая страница реферата
|
|