powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / com-port, GetOverlappedResult vs WaitForMultipleObjects
4 сообщений из 4, страница 1 из 1
com-port, GetOverlappedResult vs WaitForMultipleObjects
    #32529251
iluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ниже приведен кусок кода - обычное считывание информации с компорта в отдельном витке. вопрос - заменяет ли использование WaitFor... в данном коде вызов GetOverlappedResult.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
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;

wbr, Iluha Companets
...
Рейтинг: 0 / 0
com-port, GetOverlappedResult vs WaitForMultipleObjects
    #32529898
Фотография Yet another cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужно просто проверить, завершена ли операция, то заменяет.
=====
Cat и его покойный друг Chicago
...
Рейтинг: 0 / 0
com-port, GetOverlappedResult vs WaitForMultipleObjects
    #32529982
iluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
намек понял - я не узнаю, завершилась ли моя операция без ошибок. но нужно ли мне об этом знать? ;) я, допустим, обрабатываю события RxChar или RxFlag - в обработчике вызываю ReadFile, и там уже смотрю на ошибки. есть ли минус в таком подходе?

я имею мало опыта работы с коммуникациями, не судите строго за, возможно, чайниковские вопросы. :)

wbr, Iluha Companets
...
Рейтинг: 0 / 0
com-port, GetOverlappedResult vs WaitForMultipleObjects
    #32529987
iluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и еще, ResetEvent тут действительно необходим?

wbr, Iluha Companets
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / com-port, GetOverlappedResult vs WaitForMultipleObjects
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]