Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2018, 18:03   #1
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию Потоки

Привет, можно ли запустить 20 потоков с помощью цикла?
Код:
for g := 0 to 20 do
begin
 MyThread := TMyThread.Create(false);
 MyThread.Priority := tpNormal;   
end;
или они все лягут в 1 переменную и в итоге будет 1 поток и мне следует сделать массив потоков?
PTyTb32 вне форума Ответить с цитированием
Старый 10.09.2018, 18:15   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

да. но как их потом ждать, убивать? если не надо ждать и они самоубиваются - норм
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 10.09.2018, 18:19   #3
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
да. но как их потом ждать, убивать? если не надо ждать и они самоубиваются - норм
что да? с массивом или нет? ждать не надо, они суицидники, сканер порта по диапазону ip делаю
PTyTb32 вне форума Ответить с цитированием
Старый 10.09.2018, 19:09   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
что да?
Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
Привет, можно ли запустить 20 потоков с помощью цикла?
Цитата:
Сообщение от Slym Посмотреть сообщение
да. если не надо ждать и они самоубиваются - норм
Но стот задуматься, что будет, если вашу прогу захотят закрыть во время работы.
p51x вне форума Ответить с цитированием
Старый 10.09.2018, 19:20   #5
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Но стот задуматься, что будет, если вашу прогу захотят закрыть во время работы.
быть беде!!
уже пробую через BeginThread, но параметры приходят битые почему то..
а в нормальный паток параметры передать не удалось, но с ним проще, он сам умрет по завершению, так что если прогу закроют, они либо умрут либо выполнятся и умрут

это я все пытаюсь ускорить сканер портов путем потоков, по одному долго очень

с параметрами разобрался и потоки создаются, но в случае ошибки except не срабатывает и поток висит
вот его процедура
Код:
function scanerIP(Parameter : PMsgRecord): integer;
var
  i, d: integer;
  it: TIdTCPClient;
begin
  form1.Caption:=Parameter.ip;
  listipF := tstringlist.Create;
  it := TIdTCPClient.Create(nil);
    try
      if it.Connected then //тут ввисает
        it.Disconnect;
      it.Host := Parameter.ip;
      it.port := strtoint(Parameter.port);
      it.ConnectTimeout := Parameter.tc;
      it.Connect;
      listipF.Add(listip[i]);
      d := strtoint(Form1.Label12.Caption);
      inc(d);
      Form1.Label12.Caption := inttostr(d);
       d := strtoint(Form1.Label15.Caption);
      inc(d);
      Form1.Label15.Caption := inttostr(d);
      Form1.ProgressBar2.Position:=Form1.ProgressBar2.Position+1;
       EndThread(0);
    except
      it.Disconnect;
       Form1.ProgressBar2.Position:=Form1.ProgressBar2.Position+1;
      EndThread(0);
    end;
end;
все, сделал!
listipF.Add(listip[i]); тут нет цикла и неоткуда брать i, вот так надо listipF.Add(Parameter.ip);

Последний раз редактировалось PTyTb32; 10.09.2018 в 22:45.
PTyTb32 вне форума Ответить с цитированием
Старый 11.09.2018, 06:47   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Лучше сделать пул потоков. массив потоков.
поток сам берет параметр из списка, обрабатывает
и убивается столько при отсутствии параметров в списке, не забывая вычистить себя из пула.
и среда какая? Delphi хорошо так шагнул вперед с потоками и параллельной обработкой...
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 11.09.2018, 12:06   #7
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
Лучше сделать пул потоков. массив потоков.
поток сам берет параметр из списка, обрабатывает
и убивается столько при отсутствии параметров в списке, не забывая вычистить себя из пула.
и среда какая? Delphi хорошо так шагнул вперед с потоками и параллельной обработкой...
XE 10.2 их запускает цикл передавая каждому ip, сейчас борюсь с лютыми утечками, вылетает out of memory если диапазоны огромные. потоки живут не дольше полусекунды если доживет до пол секунды, то except вызванный connectionTimeout приведет к завершению потока, а если подключится то раньше убьется.
PTyTb32 вне форума Ответить с цитированием
Старый 11.09.2018, 13:31   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
вылетает out of memory если диапазоны огромные.
Потоки кушают много памяти. Ограничьте число потоков.

Цитата:
Сообщение от PTyTb32 Посмотреть сообщение
борюсь с лютыми утечками,
компоненты VCL не потокобезопасны поэтому вот этот участок следует выполнять через Synchronize в главном потоке.
Код:
      listipF.Add(listip[i]);
      d := strtoint(Form1.Label12.Caption);
      inc(d);
      Form1.Label12.Caption := inttostr(d);
       d := strtoint(Form1.Label15.Caption);
      inc(d);
      Form1.Label15.Caption := inttostr(d);
      Form1.ProgressBar2.Position:=Form1.ProgressBar2.Position+1;
И этот
Код:
Form1.ProgressBar2.Position:=Form1.ProgressBar2.Position+1;
В XE 10.2 используется Indy 10. А он сам создает по потоку на соединение. Так что ваши потоки тут явно лишнии.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 11.09.2018, 13:49   #9
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Так что ваши потоки тут явно лишнии.
без этих потоков он проверяет адреса последовательно, а это очень долго.
Synchronize используется в других потоках, я использую BeginThread и выглядит это вот так
Код:
 for g := 0 to strtoint(Label10.Caption) - 1 do // Label10.Caption = 28  - количество IP в диапазоне
      begin
        New(Params);
        Params.ip := listip[g];
        Params.port := Edit6.Text;
        Params.tc := strtoint(Edit7.Text);
        sss := BeginThread(nil, 0, addr(scanerIP), Params, 0, id1);

        ProgressBar2.Position := Params.p;
        closehandle(sss);
      end;
а сама функция scanerIP вот так
Код:
procedure scanerIP(Parameter: PMsgRecord);
var
  d: integer;
  it: TIdTCPClient;
begin
  it := TIdTCPClient.Create(nil);
  it.Host := Parameter.ip;
  it.port := strtoint(Parameter.port);
  it.ConnectTimeout := Parameter.tc;

  try
    it.Connect;
    Parameter.p := Parameter.p + 1;
    Form1.RichEdit1.Lines.Add(Parameter.ip + ' YES');
    d := strtoint(Form1.Label12.Caption);
    d := d + 1;
    Form1.Label12.Caption := inttostr(d);
    d := strtoint(Form1.Label15.Caption);
    d := d + 1;
    Form1.Label15.Caption := inttostr(d);
    it.free;
    EndThread(0);
  except
    on E: exception do
    begin
    it.free;
    Parameter.p := Parameter.p + 1;
    EndThread(0);
    end;

  end;

end;
при этом после сканирования 28 адресов я получаю такие утечки
Изображения
Тип файла: png 123132.png (6.1 Кб, 32 просмотров)
PTyTb32 вне форума Ответить с цитированием
Старый 11.09.2018, 13:58   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Фигня какая-то, а не функция.

Уберите оттуда всю работу с формой, сделайте чистую функцию, которая просто принимает адрес и возвращает результат.
При завершении потока передавайте куда-нибудь результат, например с помощью событий/callback'ов, синхронизируйтесь с основным потоком. В TThread вроде есть готовый OnTerminate для этого.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
потоки Cpluser C# (си шарп) 1 28.10.2012 17:00
Потоки _Mixer_ Общие вопросы по Java, Java SE, Kotlin 4 16.10.2011 19:25
Потоки С++ Aleksin Помощь студентам 1 07.11.2010 18:15
потоки tanek Помощь студентам 6 15.03.2010 21:42