Показать сообщение отдельно
  #5  
Старый 24.10.2022, 23:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

Сейчас посмотрел на лог. Ну, похоже, что все общение идет в режиме "запрос-ответ". Т.е. ридер будет собирать все в кучку, а парсер в отдельном потоке будет все это разбирать и выдвать уже готовый результат. Т.е. с точки зрения парсера это будет непрерывный поток данных.
Т.е. тебе надо
1. Добиться того, что бы читатель генерировал выходной, например текстовый, поток без сбоев на границах пакетов. И потом этот поток помещается (добавляется) в буферный TStringList.
2. Дополнительный поток (thread) читает этот буфер и парсит, если ответ еще не пришел, то поток просто ждет пока ридер не накидает ему данных.

Тут еще надо посмотреть как пиходят пакеты (одна строка и это ты ее на части бъешь или оно уже многострочное приходит). В зависимости от этого и надо будет проектировать и ридер и парсер. Хотя, если ридер обеспечит нормальный текстовы поток, то парсер уж тогда простой получится. Типа читаем строку, если в ней есть "AT Send" то пошла команда, начинаем парсить команду, далее ждем пока не найдем строку с "AT Recv", там на следующих строках будет ответ пока не получим строку с "ОК" - все, парсинг закончен, выдаем событие в главный поток программы для вывода результата. Далее повторяем.

Только не забудь критические секции для доступа к буферу.
Ну и событие генерировать... даже не знаю как лучше сделать.
Может ридер тоже в отдельный поток "выкинуть", что бы главный поток со своими отрисовками и прочими действиями не тромозил его. И тогда парсер может вызывать событие главной формы сам, или вообще напрямую через Synchronize заполнять компоненты. А если нет, то можно посылать сообщение (PostMessage) и тогда оно попадет в очередь сообщений и будет обработано когда будет свободное время
Ответить с цитированием