Держать потоки TThread в списке TList.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Держать потоки TThread в списке TList.

Сообщение and_rivne » 10.08.2018 09:54:11

Добрый день.
Нужно перенаправить все входящие запросы с браузеров на другой сервер и вернуть им результаты.
Такой себе myProxy.

В результате, исходящие данные:
Код: Выделить всё
uses  blcksock; //from synapse

type
   TClientThread = class(TThread)
   public
     Socket: TTCPBlockSocket;
   end;

var
  Socket: TTCPBlockSocket;
  T: TClientThread;
  ThreadList: TList;


Запускаю программу, жду подключений и запихиваю их в TList
Код: Выделить всё
Socket.CreateSocket;
Socket.Bind(Socket.LocalName,'57777');

repeat
  if Socket.CanRead(100) then
       begin
          T:=TClientThread.Create(Socket.Accept);
          ThreadList.Add(pointer(T));                 
          T.Start;
       end;
until Terminated;


В какой то момент отдаю им ответы:
Код: Выделить всё
var
  cln : TClientThread;

for i:=0 to ThreadList.Count-1 do
  begin
    cln := TClientThread(ListenerClient.ThreadList.Items[i]).Socket.SendString('ok');
  end;


И вот на элементах с индексом >0 получаю исключение SIGSEGV
Не могу понять, это что-то с сокетом, или я не правильно придумал схему.
and_rivne
новенький
 
Сообщения: 20
Зарегистрирован: 09.12.2011 13:40:42

Re: Держать потоки TThread в списке TList.

Сообщение serbod » 10.08.2018 10:21:10

Может у тебя TThread сам себя убивает?

Я бы сделал иначе, всего один TThread и список сокетов, которые в потоке поочередно опрашиваются. А то если будет много потоков, то начнутся тормоза и глюки.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Держать потоки TThread в списке TList.

Сообщение and_rivne » 10.08.2018 10:24:17

Может у тебя TThread сам себя убивает?

Для потока с индексом 0 - все норм.
И свойства сокетов доступны. А вот методы - нет :cry:

Добавлено спустя 7 минут 15 секунд:
У меня сокеты в рамках TTCPBlockSocket.
Как их можно держать отдельно?

И нет ли проблем с pointer в Lazarus ?
and_rivne
новенький
 
Сообщения: 20
Зарегистрирован: 09.12.2011 13:40:42

Re: Держать потоки TThread в списке TList.

Сообщение olegy123 » 10.08.2018 11:26:54

and_rivne писал(а):И нет ли проблем с pointer в Lazarus ?
Нет. Вообще freepascal - это обычный самокат, похож на С/С++. Указатель указывает куда то с тем работает. Если не туда ловлю exception.

and_rivne писал(а):У меня сокеты в рамках TTCPBlockSocket.
Как их можно держать отдельно?
Они создаются в кучк. TList это просто список где объекты в памяти.
Вопрос, корректен ли список. Не помер ли сам объект. Синхронизированные ли действия с объектами и их данными..

and_rivne писал(а):Для потока с индексом 0 - все норм.
И свойства сокетов доступны. А вот методы - нет
Сомтрите сам объект это некий TRecord с элементами, а вот методы - статик, т.е. в TTCPBlockSocket не тянет в переменную сам код. Скорее ни свойства, ни методы, ни сам объект - не правильные, TList содержить не правильные значения. А данные для Сокетов просто не дают exception.

У меня недавно был вопрос про переменную класса (var obj:TObject) , чем отличается от указателя на сам объект (var p_obj:^TObject) , как мне разъяснили obj это есть указатель на объект (т.е. obj:Pointer), просто в паскале не удобно писать obj^.метод, принято опускать знак "^", т.е. obj.метод(это на самом деле есть obj^.метод) .

Добавлено спустя 5 минут 30 секунд:
у меня аналогично была проблема с сохранением и в дальнейшей работой Self значением.
Я подымал эту тему.Когда TObject на самом деле становится PObject-ом..
viewtopic.php?f=1&t=25592#p127187
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Держать потоки TThread в списке TList.

Сообщение and_rivne » 10.08.2018 11:58:22

Интересная получилась дискуссия в Вашей теме по указателях.
Я еще больше напрягся :D
По моей проблеме: если предположить, что поток жив и сокет в нем активный. Как порекомендуете держать список этих TTCPBlockSocket? Чтобы и свойства и методы указывали именно на этот объект.
and_rivne
новенький
 
Сообщения: 20
Зарегистрирован: 09.12.2011 13:40:42

Re: Держать потоки TThread в списке TList.

Сообщение fedan » 10.08.2018 12:22:52

Там где-то есть TThreadList. Используй его вместо TList.
fedan
новенький
 
Сообщения: 70
Зарегистрирован: 15.09.2016 21:18:48

Re: Держать потоки TThread в списке TList.

Сообщение olegy123 » 10.08.2018 13:28:07

and_rivne писал(а):Интересная получилась дискуссия в Вашей теме по указателях.
У меня необходимость была обрабатывать объекты в разных TThread, Столкнулся с проблемой что в методах Self не тот, и свойства не те.

and_rivne писал(а):По моей проблеме: если предположить, что поток жив и сокет в нем активный. Как порекомендуете держать список этих TTCPBlockSocket? Чтобы и свойства и методы указывали именно на этот объект.

TList.add(TObject(obj))
TObject(TList.Items[index])
вполне хватает.

Добавлено спустя 2 минуты 42 секунды:
есть же TObjectList, также он при Clear() может вызывает Free для каждого объекта.

Но нужно для надежности в многозадачности работать с синхронностью выполнения (мютексы, критические секции, ожидания). Тогда никогда не получите except.


Добавлено спустя 10 минут 56 секунд:
Да еще один момент
есть TList и TFPList
в TList после Delete, Clear нужно вызывать Pack - при долгой работе или больших количествах Items это важно, там используются обычный динамический массив, который самостоятельно не усекается. нужно вызывать Pack - дефрагментация array.
TFPList лишен этих проблем, так как там обычная цепочка элементов, но при большом количестве вставок/удалений - возможны уменьшение скорости при реорганизации цепочек.

есть TFPObjectList
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Держать потоки TThread в списке TList.

Сообщение java73 » 13.08.2018 09:55:16

olegy123 писал(а):есть TFPObjectList

TFPGObjectList
модуль fgl
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Держать потоки TThread в списке TList.

Сообщение serbod » 13.08.2018 11:43:58

and_rivne писал(а):У меня сокеты в рамках TTCPBlockSocket.
Как их можно держать отдельно?


Как-то так - https://github.com/serbod/dataport/blob ... PortIP.pas
Смотри классы TIpSocketPool и TIpReadThread
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 37

Рейтинг@Mail.ru