Здравствуйте, _alecs, Вы писали:
_>Ну, данное поведение кажется я уже описал в 4-ом сообщении. Но вопрос: — "Как элигантным образом сбросить событие перед вызовом WaitCommEvent?" остаётся открытым..
Не плоди сущностей без необходимости. Это событие, равно как и то, с помощью которого прерывается цикл, нафиг не сдалось. WaitCommEvent вызывается синхронно, когда нужно прервать — зовем SetCommMask(handle, 0), при этом ожидание в WaitCommEvent прерывается и она возвращает 0 в маске. Вот работающий код на Дельфи:
while FConnected do begin
dwEvtMask := 0;
WaitCommEvent(FHandle, dwEvtMask, nil);
if (dwEvtMask and EV_RXCHAR) <> EV_RXCHAR then continue;
repeat
ClearCommError(FHandle, dwErrorFlags, @ComStat);
n := ComStat.cbInQue;
if n > sizeof(Buffer) then n := sizeof(Buffer);
if n = 0 then break;
if not ReadFile(FHandle, Buffer, n, n, @osRead) then
begin
dwError := GetLastError;
if dwError = ERROR_IO_PENDING then begin
GetOverlappedResult(FHandle, osRead, n, TRUE);
end
else begin
DoError;
break;
end;
end;
// Тут обрабатываются принятые данные...
until FALSE;
end; // while FConnected
// для прерывания:
FConnected := False;
SetCommMask(FHandle, 0);