Реферат: Ещё раз о прямом доступе к аппаратуре
// заполним структуры для асинхронной работы
FillChar(eOverlapped, SizeOf(eOverlapped), 0);
eOverlapped.hEvent := FChangeEvent;
eHandles[0] := eOverlapped.hEvent;
eHandles[1] := FTerminateEvent;
eHandles[2] := FFlutterTimer;
// 0.5 секундыдля SetWaitableTimer
eTime := -5000000;
// Ничего себе точность, не правда ли?
// предварительно взведем флаг ожидания события, чтобы цикл заработал
InitWaitCommEvent;
while not Terminated do
case WaitForMultipleObjects(3, @eHandles, False, INFINITE) of
// при изменении состояния порта
WAIT_OBJECT_0:
begin
// опять взведем флаг ожидания события
InitWaitCommEvent;
// для подавления дребезга сделаем небольшую задержку. Если состояние
// порта изменится быстрее, чем истечет время задержки (дребезг), то
// таймер просто будет переведен "на попозже".
Win32Check(SetWaitableTimer(FFlutterTimer, eTime, 0, nil, nil,
False));
end;
// при запросе принудительного завершении потока
WAIT_OBJECT_0 + 1:
// незамедлительный выход - завершение выполнения потока
Exit;
// после задержки для подавления дребезга