Re[11]: Двойное срабатывание WaitCommEvent
От: Sergei I. Gorelkin Россия  
Дата: 20.02.08 19:49
Оценка: +1
Здравствуйте, _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);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.