ниже приведен кусок кода — обычное считывание информации с компорта в отдельном витке. вопрос — заменяет ли использование WaitFor... в данном коде вызов GetOverlappedResult.
procedure TComThread.Execute;
var
hArr: TWOHandleArray;
wMask, dw: dword;
EventsCnt: byte;
ComStat: TComStat;
WaitCompleted: Boolean;
begin
hArr[0] := FComPort.FOverlapped.hEvent;
hArr[1] := ThreadEvent;
EventsCnt := 2;
while not Terminated do begin
try
if not FComPort.Connected then begin
if not DoOpenComPort then begin
Delay(COM_ERROR_DELAY);
Continue;
end;
end;
CheckRxTO;
FComPort.ApplyMask; // маску событий надо заново установить (вызывается SetCommMask)
wMask := 0;
WaitCompleted := WaitCommEvent(FComPort.Handle, wMask, @FComPort.FOverlapped);
if not WaitCompleted and (GetLastError = ERROR_IO_PENDING) then
// надо подождать завершения события
WaitCompleted :=
(WaitForMultipleObjects(EventsCnt, @hArr, False, RxTO) = WAIT_OBJECT_0);
// надо ли сюда добавлять условие
// GetOverlappedResult(FComPort.Handle, FComPort.FOverlapped, BytesCnt, False)
// ???
if WaitCompleted then
// обработаем события
DispatchComMsg(wMask)
else
begin
// прервем выполнение WaitCommEvent, сбросив маску
wMask := 0;
SetCommMask(FComPort.Handle, wMask);
end;
// на всякий случай, событие-то Manual-Reset!!!
ResetEvent(FComPort.FOverlapped.hEvent);
if not ClearCommError(FComPort.FHandle, dw, @ComStat) then
begin
FComPort.Error(GetLastError, cpoClearErr);
FComPort.Close;
Delay(COM_ERROR_DELAY);
end;
except
HandleException;
Continue;
end;
end; { while }
PurgeComm(FComPort.Handle, PURGE_TXCLEAR or PURGE_RXCLEAR); { clear buffers }
end;