Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
[Delphi] Threads (проблема) |

23.01.2009, 03:46
|
|
Участник форума
Регистрация: 22.11.2008
Сообщений: 142
Провел на форуме: 636446
Репутация:
32
|
|
[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;
Соответственно цикл из потока был убран и поток стал выполнять одно действие.
Но возникла другая проблемма.
Моя прога стала ох..енно жрать память.
Кто мне что посоветует?
На динамику всё проверил. Там всё освобождается.
Последний раз редактировалось Flenov; 23.01.2009 в 03:55..
|
|
|

23.01.2009, 03:50
|
|
Banned
Регистрация: 06.01.2008
Сообщений: 904
Провел на форуме: 4037638
Репутация:
1821
|
|
Для начала код заключи в теги [code], не читабельно.
|
|
|

23.01.2009, 03:50
|
|
Участник форума
Регистрация: 22.11.2008
Сообщений: 142
Провел на форуме: 636446
Репутация:
32
|
|
Также пробовал по принципу создали подождали оттерминатели.
Непомогает.
|
|
|

31.01.2009, 23:17
|
|
Новичок
Регистрация: 04.01.2008
Сообщений: 6
Провел на форуме: 33792
Репутация:
0
|
|
Сообщение от Flenov
Также пробовал по принципу создали подождали оттерминатели.
Непомогает.
idhttp в потоках жрет память. используй сокеты.
|
|
|

31.01.2009, 23:57
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме: 1892597
Репутация:
836
|
|
класс родитель Thread так ты и потомка еще так обозвал?! О_О
утечка памяти скорее всего в том что у тебя потоки не освобождаются.
проверь освобождаются ли они у тебя, process explorer показывается, колл-во активных потоков у приложения.
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
|
|
|

01.02.2009, 10:56
|
|
Участник форума
Регистрация: 22.11.2008
Сообщений: 142
Провел на форуме: 636446
Репутация:
32
|
|
Сообщение от telt
idhttp в потоках жрет память. используй сокеты.
Ты прав.
Наверно, это самое нормальное решение.
|
|
|

03.02.2009, 21:33
|
|
Новичок
Регистрация: 03.02.2009
Сообщений: 15
Провел на форуме: 93182
Репутация:
21
|
|
Мой самописный брут до 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;
каждый новозапущенный тред узнает свой номер из втхрнум и запоминает его в своей локальной переменной. Соответственно каждый тред использует только свой ИдХТТП. Поясните что тут может *засираться*
|
|
|

03.02.2009, 22:20
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
п**ц брутер на IdHTTP. Скоро наверное вообще будут ддос боты на Indy постоенные.
Лучше юзай вондовые потоки, а не класс дельфяный. потому что Виндовые они сами всё освобождают после свого закрытие. Юзай CreateThread
Также если работаешь с http то если тяжко заюзать сокеты, то хотябы юзай функции их wininet (InternetOpen итд итп)
|
|
|

03.02.2009, 22:29
|
|
Новичок
Регистрация: 03.02.2009
Сообщений: 15
Провел на форуме: 93182
Репутация:
21
|
|
Смысл этого самоосвобождения если у меня в процедуре потока стоит while а сразу после него thr[num].stop; thr[num].free;
а насчет разницы в скорости тут вопрос, будет ли она достаточной чтобы заставить меня переписывать весь код уже готового брута.
[offtop] для ддоса можно IP*works заюзать для разнообразия  [/offtop]
Последний раз редактировалось stasoft; 03.02.2009 в 22:33..
|
|
|

06.02.2009, 00:59
|
|
Участник форума
Регистрация: 22.11.2008
Сообщений: 142
Провел на форуме: 636446
Репутация:
32
|
|
Весма буду благодарен за фрагменты кода.
Заранее спасибо.
В отличае от Миши у меня опыта поменьше.
Так что извиняйте за нерациональность.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|