Показать сообщение отдельно
  #9  
Старый 31.08.2015, 14:52
Yes_Maks Yes_Maks вне форума
Прохожий
 
Регистрация: 22.07.2014
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Народ, тема не закрыта. Помогите советом пожалуйста. Почитав статей и книг по организации работы с com портом в параллельном потоке, все сходятся на мысли что поток чтения данных с ком порта надо делать так:
Код:
...
procedure COM_Thread.Execute;
begin
  While not Terminated do
    begin
      If not WaitCommEvent(hCOM,TMask,@Ovr) then
      if GetLastError = ERROR_IO_PENDING  then
        WaitForSingleObject(Ovr.hEvent, INFINITE);//Ожидаем приема до бесконечности
      ClearCommError(hCOM,xn,@StatCOM);//Получаем состояние порта в StatCOM
      xn:= StatCOM.cbInQue;//Реальное количество байт в буфере
      If xn>0 then
        If ReadFile(hCOM,paket,xn,xn,@ovr) then
          SendMessage(Form1.Handle,wmCOM,1,0);
    end;
end;
Я собственно так же и сделал. В основном потоке порт открываю естественно с флагом FILE_FLAG_OVERLAPPED, устанавливаю событие-маску
Код:
Ovr.hEvent:= CreateEvent(nil,True,False,nil)
, где Ovr и есть структура оверлаппинга TOverlapped.
Все хорошо, но только тогда, когда приложение ничего не делает и только ждет каких то данных от порта. Тогда да, пакет пришел в порт, дополнительный поток его принял, обработал, отправил сообщение главному окну, в главном потоке сообщение обработалось.
Но у меня приложение регулярно в цикле опрашивает 255 устройств. Опрос идет из главного потока. Там я пишу в порт
Код:
WriteFile(hCOM,paket,15,xn,@Ovr);

Так вот, когда идет последовательный опрос, с устройств тут же приходит пакет-ответ. НО дополнительный поток НЕ обрабатывает эти пакеты, пока не прогонится весь цикл. А когда цикл прогонится, обрабатывается всего лишь один или два пакета, которые остались в буфере. остальное пропадает. Подскажите как сделать синхронизацию между потоками грамотно и можно ли это сделать в делфи7 вообще?
Ответить с цитированием