
13.02.2015, 00:45
|
 |
.
|
|
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
|
|
Хотел написать про WaitForSingleObject, а написал WaitCommEvent.
Не помню где брал, но у меня работает.
Код:
function ReadThread(P : Pointer) : DWORD; stdcall;
var
asp : TAsyncPort;
cs : COMSTAT; // структура текущего состояния
// порта, в данной программе
// используется для определения
// количества принятых в порт байтов
btr,
Temp,
Mask,
Signal : DWORD; // переменная temp используется в
// качестве заглушки
begin
asp := TAsyncPort(P);
rdo.hEvent := CreateEvent(NIL, True, True, NIL); // создать сигнальный объект-событие
// для асинхронных операций
SetCommMask(asp.fCom, EV_RXCHAR); // установить маску на срабатывание
// по событию приёма байта в порт
while True do // пока поток не будет прерван,
// выполняем цикл
begin
WaitCommEvent(asp.fCom, Mask, @rdo); // ожидать события приёма байта
// (это и есть перекрываемая операция)
Signal := WaitForSingleObject(rdo.hEvent, INFINITE); // приостановить поток до прихода байта
if Signal = WAIT_OBJECT_0 then // если событие прихода байта произошло
begin
if GetOverlappedResult(asp.fCom, rdo, Temp, True) then // проверяем, успешно ли завершилась
// перекрываемая операция WaitCommEvent
if (mask and EV_RXCHAR) <> 0 then // если произошло именно событие
// прихода байта
begin
ClearCommError(asp.fCom, Temp, @cs); // нужно заполнить структуру COMSTAT
btr := cs.cbInQue; // и получить из неё количество принятых байтов
if btr > 0 then // если действительно есть байты для чтения
begin
ReadFile(asp.fCom, BufRd[0], btr, Temp, @rdo); // прочитать байты из порта в буфер программы
end;
end;
end;
end;
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
|