Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [Delphi] Threads (проблема) (https://forum.antichat.xyz/showthread.php?t=102645)

Flenov 23.01.2009 03:46

[Delphi] Threads (проблема)
 
Название не случайно.
Эти грёбаные потоки забрали у меня столько нервов, что просто ужас, но речь не о нервах.

Я поставил цель создать в Delphi 7 многопоточное приложение, которое будет работать с определённым узлом интернета.
Но этот узел нестабилен.
Когда к нему можно подкл, а когда низя.
Сначала я решил поступить так:
Я объявил массив для потоков.
Код:

TH: array[1..25] of Thread; //Кстати само имя класса Thread
А в самом потоке был цикл
Код:

while(условие, что есть данные) do
//Ну и тд.

Создавал я их иллементарно просто.
Код:

for i:=1 to 25 do
                        begin
                            TH[i]:=Thread.Create(False);
                            TH[i].FreeOnTerminate:=True;
                            TH[i].Priotity:=tpLowest;
                        end;

Но возникала проблемма, что через некоторое время все потоки засирались и дальше прога не работала.

Я решил поступить иначе.
Я кинул на форму таймер и на него стал создавать потоки разумеется с определённым интервалом
Код:

                            if (i>25) then i:=1;
                            TH[i]:=Thread.Create(False);
                            TH[i].FreeOnTerminate:=True;
                            TH[i].Priotity:=tpLowest;
                            i:=i+1;

Соответственно цикл из потока был убран и поток стал выполнять одно действие.

Но возникла другая проблемма.
Моя прога стала ох..енно жрать память.

Кто мне что посоветует?
На динамику всё проверил. Там всё освобождается.

De-visible 23.01.2009 03:50

Для начала код заключи в теги [code], не читабельно.

Flenov 23.01.2009 03:50

Также пробовал по принципу создали подождали оттерминатели.
Непомогает.

telt 31.01.2009 23:17

Цитата:

Сообщение от Flenov
Также пробовал по принципу создали подождали оттерминатели.
Непомогает.

idhttp в потоках жрет память. используй сокеты.

W!z@rD 31.01.2009 23:57

класс родитель Thread так ты и потомка еще так обозвал?! О_О

утечка памяти скорее всего в том что у тебя потоки не освобождаются.
проверь освобождаются ли они у тебя, process explorer показывается, колл-во активных потоков у приложения.

Flenov 01.02.2009 10:56

Цитата:

Сообщение от telt
idhttp в потоках жрет память. используй сокеты.

Ты прав.
Наверно, это самое нормальное решение.

stasoft 03.02.2009 21:33

Мой самописный брут до 1700 потоков держит, TIdThreadComponent из индей девятых + из тех же индей IdHTTP.

Код:


for i:=1 to HowMany do begin
http[i]:=TIdHTTP.Create(form1);
thr[i]:=TIdThreadComponent.Create(form1);
thr[i].OnRun:=Form1.thrrun;
end;

потом:

Код:


for i:=1 to HowMany do begin
  thr[i].Start;
  Inc(vthrnum);
  Application.ProcessMessages;
  Sleep(15);
 end;

каждый новозапущенный тред узнает свой номер из втхрнум и запоминает его в своей локальной переменной. Соответственно каждый тред использует только свой ИдХТТП. Поясните что тут может *засираться*

slesh 03.02.2009 22:20

п**ц брутер на IdHTTP. Скоро наверное вообще будут ддос боты на Indy постоенные.

Лучше юзай вондовые потоки, а не класс дельфяный. потому что Виндовые они сами всё освобождают после свого закрытие. Юзай CreateThread

Также если работаешь с http то если тяжко заюзать сокеты, то хотябы юзай функции их wininet (InternetOpen итд итп)

stasoft 03.02.2009 22:29

Смысл этого самоосвобождения если у меня в процедуре потока стоит while а сразу после него thr[num].stop; thr[num].free;
а насчет разницы в скорости тут вопрос, будет ли она достаточной чтобы заставить меня переписывать весь код уже готового брута.

[offtop] для ддоса можно IP*works заюзать для разнообразия :D [/offtop]

Flenov 06.02.2009 00:59

Весма буду благодарен за фрагменты кода.
Заранее спасибо.


В отличае от Миши у меня опыта поменьше.
Так что извиняйте за нерациональность.


Время: 09:36