Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Ограничения по количеству компонент?  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 499
Добрый день, коллеги!

Вопрос пространный, практически без кода.
Есть сервис c неким образным классом и списком
TMyClass=class
   FAQ:TADOQuery;
   FidTeLNt:TIDTelnet;
   private
     procedure ParseReceivedData(const AText:string);
end;

TArrMyClass=class(TObjectList<TMyClass>)


Каждый экземпляр класса обращается к заданному IP адресу, отправляет стартовую команду а-ля Start и далее бесконечно читает и парсит полученные текстовые наборы данных (неисправляемо на иные форматы, такая задумка инженеров).
Скорость чтения - около 10 наборов по 80 символов в секунду (~800 знаков/сек) каждым классом.

Данные поступают пакетно, когда процедура ParseReceivedData обнаруживает финальный символ (например, символ "!"), то формируется SQL запрос в AdoQuery.
AdoQuery привязано к AdoConnection в DataModule.

Ситуация:
Если создано менее 16 классов, то данные поступают без проблем.
Если добавляю 16+ классы, то рандомно некоторые классы перестают обрабатывать приходящие данные. В логе системы я вижу текст поступившего пакета, но нет информации о входе в процедуру парсинга и следовательно нет записи в БД.

Может ли повреждаться память при столь агрессивном чтении и обработке данных и приводить к невозможности выполнения процедуры внутри класса или необходимо\желательно разнести классы по разным потокам?
Может быть дело в IDTelnet, но как его проверить?
Может кто-то уже сталкивался с таким?
Может быть стоит пересмотреть архитектуру и есть похожие решения?

Никаких пустых try except end в коде нет, все ошибки сразу попадают в лог.
Сервис стартует и останавливается без ошибок, в EventLog тоже всё чисто.
Из глобального только DataModule и AdoConnection на нём и ArrMyClass. Все обработки только внутри класса.

Windows Server 2012, Delphi Tokyo 10.2
23 мар 20, 14:30    [22104497]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения по количеству компонент?  [new]
goldmi45
Member

Откуда:
Сообщений: 1234
Kast2K
В логе системы я вижу текст поступившего пакета, но нет информации о входе в процедуру парсинга и следовательно нет записи в БД.

Ищите ошибку между этими событиями. Добавляйте в лог больше сообщений о состоянии системы.
23 мар 20, 16:33    [22104602]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения по количеству компонент?  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1093
простите, а где отдельный adoconnection для каждого adoquery при многопотоке?
23 мар 20, 18:10    [22104692]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения по количеству компонент?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26442
энди
простите, а где отдельный adoconnection для каждого adoquery при многопотоке?

У него и нет многопотоков. Спрашивает - нужно-ли?
Kast2K
или необходимо\желательно разнести классы по разным потокам?

Что для меня вопрос странный. Это было необходимо делать изначально.
24 мар 20, 07:34    [22104874]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения по количеству компонент?  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 499
goldmi45,

боюсь что дело не в этом
procedure TEQP.DataAvailableOnTelnet(Sender: TIdTelnet;
  const Buffer: TIdBytes);
var
  s:string;
begin
  s:=Trim(BytesToString(Buffer));
  Log('EQP'+Fid.Tostring+' received:'+s);
  ParseReceivedData(s);
end;

procedure TEQP.ParseReceivedData(const AText:string);
begin
  Log('EQP'+Fid.Tostring+' ParseReceivedData:'+AText);
  ... //обработка
end;


энди,
Разве одного общего AdoConnection не достаточно на несколько (десятков) одновременно работающих классов?
автор
The connection provided by a single TADOConnection component can be shared by multiple ADO command and dataset components
24 мар 20, 07:37    [22104875]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения по количеству компонент?  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 499
wadman
энди
простите, а где отдельный adoconnection для каждого adoquery при многопотоке?

У него и нет многопотоков. Спрашивает - нужно-ли?
Kast2K
или необходимо\желательно разнести классы по разным потокам?

Что для меня вопрос странный. Это было необходимо делать изначально.


Добрый день!
Т.е. самое верное было создавать N-потоков, в каждом из которых крутится свой класс с IDTelnet, Adoconnection, правильно?
24 мар 20, 07:40    [22104877]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения по количеству компонент?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26442
Kast2K
wadman
пропущено...

У него и нет многопотоков. Спрашивает - нужно-ли?
пропущено...

Что для меня вопрос странный. Это было необходимо делать изначально.


Добрый день!
Т.е. самое верное было создавать N-потоков, в каждом из которых крутится свой класс с IDTelnet, Adoconnection, правильно?

Не знаю, что такое IDTelnet и как оно живет в многопоточке, а в остальном - да. Все соединения и запросы разнести по потокам.
24 мар 20, 07:54    [22104881]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения по количеству компонент?  [new]
alekcvp
Member

Откуда:
Сообщений: 1894
Kast2K
энди,
Разве одного общего AdoConnection не достаточно на несколько (десятков) одновременно работающих классов?
автор
The connection provided by a single TADOConnection component can be shared by multiple ADO command and dataset components

Достаточно, при условии что они все работают в одном потоке.
24 мар 20, 09:20    [22104906]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения по количеству компонент?  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1419
Kast2K,

вполне возможно, что TEQP.DataAvailableOnTelnet вызывает из другого потока и тогда у это многопоточное приложение со всеми вытекающими. проверить - поставить брейк пойнт и посмотреть потоки View\Threads что ли, на каком потоке стоит селект
24 мар 20, 09:20    [22104907]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения по количеству компонент?  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 499
Коллеги,
Как было ранее предложено, разнёс классы по потокам - проблем нет.
Для эксперимента довел количество до 150 потоков = зависаний или пропусков нет.

Большое спасибо.
25 мар 20, 11:06    [22105561]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить