com-port, GetOverlappedResult vs WaitForMultipleObjects
От: iluha2  
Дата: 22.05.04 08:55
Оценка:
ниже приведен кусок кода — обычное считывание информации с компорта в отдельном витке. вопрос — заменяет ли использование 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;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.