PDA

Просмотр полной версии : [Delphi] Threads (проблема)


Flenov
23.01.2009, 03:46
Название не случайно.
Эти грёбаные потоки забрали у меня столько нервов, что просто ужас, но речь не о нервах.

Я поставил цель создать в 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
Также пробовал по принципу создали подождали оттерминатели.
Непомогает.
idhttp в потоках жрет память. используй сокеты.

W!z@rD
31.01.2009, 23:57
класс родитель Thread так ты и потомка еще так обозвал?! О_О

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

Flenov
01.02.2009, 10:56
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;
а насчет разницы в скорости тут вопрос, будет ли она достаточной чтобы заставить меня переписывать весь код уже готового брута.

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

Flenov
06.02.2009, 00:59
Весма буду благодарен за фрагменты кода.
Заранее спасибо.


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

Flenov
06.02.2009, 01:20
Мой самописный брут до 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;

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

Если не сложно, приведи больше кода.
Мне очень интересен твой подход.

Flenov
17.03.2009, 08:45
Ээх.
Не в потоках дело было, а в функциях.
Буду их в DLL загонять.
Всё перепробовал.
Осталось тока это.