
23.04.2010, 14:30
|
|
Участник форума
Регистрация: 09.05.2009
Сообщений: 186
С нами:
8951426
Репутация:
102
|
|
потоки и indy [delphi]
допустим есть код:
Код:
procedure tnew.getln;
var
t:tstringlist;
i:integer;
begin
for i:=0 to form1.memo1.lines.count-1 do
begin
t:=stringlist.create;
t.text:=form1.idhttp1.get(form1.memo1.lines[i]);
form1.memo2.lines.add(t.text);
end;
end;
как сделать, чтобы, скажем, потоков 20 паралельно его выполняли?
пытался примерно вот так:
Код:
tnew = class(tthread)
private
procedure getln;
protected
procedure execute; override;
end;
var
form1: tform1;
new1, new2: tnew;
i:integer;
procedure tform1.button1click(sender: tobject);
begin
new1 := tnew.create(true);
new1.freeonterminate := true;
new1.s := '1 thread';
new1.priority := tpnormal;
new2 := tnew.create(true);
new2.freeonterminate := true;
new2.s := '2 thread';
new2.priority := tpnormal;
new1.resume;
new2.resume;
end;
procedure tnew.getln;
var
t:tstringlist;
i:integer;
begin
for i:=0 to form1.memo1.lines.count-1 do
begin
t:=stringlist.create;
t.text:=form1.idhttp1.get(form1.memo1.lines[i]);
form1.memo2.lines.add(t.text);
end;
end;
procedure tnew.execute;
begin
getln;
end;
но idhttp1 вылетает с ошибкой или виснет (непомню точно, влом делфи включать) 
краем уха слышал про idthreadcomponent, но адекватных примеров его использования я не нашел..
помогите!!!!11
|
|
|

23.04.2010, 14:38
|
|
Новичок
Регистрация: 26.08.2009
Сообщений: 19
С нами:
8794249
Репутация:
33
|
|
Создавай все компоненты в Execute перед выполнением работы а не в процедурах.
И уничтожай потом в Destroy или где там у тебя завершение.
И делай синхронизацию потоков с формой.
Ты можешь в литровую банку сразу 5 рук засунуть?
З.Ы. И что у тебя за бред с созданием TStringList?
Он у тебя создаётся по сто раз и ни разу не уничтожается!
|
|
|

24.04.2010, 00:19
|
|
Участник форума
Регистрация: 09.05.2009
Сообщений: 186
С нами:
8951426
Репутация:
102
|
|
Сообщение от ange007
Создавай все компоненты в Execute перед выполнением работы а не в процедурах.
И уничтожай потом в Destroy или где там у тебя завершение.
создаю
Код:
tnew = class(tthread)
private
http:TIdHTTP;
cook:tidcookiemanager;
protected
procedure execute; override;end;
procedure tnew.execute;
begin
http:=form1.idhttp1.Create;
http.HandleRedirects:=true;
cook:=form1.idcookiemanager1.Create(http);
http.CookieManager:=cook;
<..>
end;
первый поток грузится, после выдаёт "a component named idcookiemanager1 already exist"
wft? что я делаю не так?
|
|
|

23.04.2010, 14:39
|
|
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
С нами:
9227388
Репутация:
180
|
|
1) Synchronize
2) объект TIdHTTP сделай локальным для потока
Ты можешь в литровую банку сразу 5 рук засунуть?
Если руки кривые, обычно так и делают =)
|
|
|

23.04.2010, 15:02
|
|
Участник форума
Регистрация: 09.05.2009
Сообщений: 186
С нами:
8951426
Репутация:
102
|
|
Сообщение от ange007
Создавай все компоненты в Execute перед выполнением работы а не в процедурах.
И уничтожай потом в Destroy или где там у тебя завершение.
З.Ы. И что у тебя за бред с созданием TStringList?
Он у тебя создаётся по сто раз и ни разу не уничтожается!
спасибо, учту.
ды это примерный код, я его тут и придумал (: главное - айдихттп
Сообщение от M_script_
2) объект TIdHTTP сделай локальным для потока
2) пример можно? 
Последний раз редактировалось 1n0y; 23.04.2010 в 15:04..
|
|
|

23.04.2010, 15:09
|
|
Новичок
Регистрация: 26.08.2009
Сообщений: 19
С нами:
8794249
Репутация:
33
|
|
Сообщение от 1n0y
2) пример можно? 
Код:
tnew = class(tthread)
private
idHTTP:TIdHTTP;
procedure getln;
protected
procedure execute; override;
end;
|
|
|

23.04.2010, 15:10
|
|
Постоянный
Регистрация: 13.11.2009
Сообщений: 437
С нами:
8680278
Репутация:
17
|
|
один из простых вариантов юзать MPI 
|
|
|

23.04.2010, 15:16
|
|
Участник форума
Регистрация: 09.05.2009
Сообщений: 186
С нами:
8951426
Репутация:
102
|
|
Сообщение от cheater_man
один из простых вариантов юзать MPI 
"Существуют реализации для языков Фортран 77/90, Си и Си++." 
|
|
|

23.04.2010, 15:15
|
|
Участник форума
Регистрация: 09.05.2009
Сообщений: 186
С нами:
8951426
Репутация:
102
|
|
блин, пример как создавать 
в tform1.button1click добавить это?
new1.idHTTP=idhttp.create; (или как там правильно создавать?)
new2.idHTTP=idhttp.create;
newN.idHTTP=idhttp.create;
|
|
|

23.04.2010, 15:32
|
|
Участник форума
Регистрация: 20.12.2008
Сообщений: 277
С нами:
9152955
Репутация:
84
|
|
IdHttp надо создавать в конструкторе класса потока..и уничтожать в деструкторе (хотя так и не обязательно, у меня например idhttp и потоки существуют независимо друг от друга, у меня что-то вроде многопоточной очереди)
ТС я тебе советую сначала почитать про классы, научится их писать самому, иначе тебе придется ой как трудно в создании мультитредных сетевых аппликаций
Последний раз редактировалось GhostOnline; 23.04.2010 в 15:35..
|
|
|
|
 |
|
Похожие темы
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Установка Indy 10.5.6
|
НTL |
С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby |
10 |
20.12.2009 09:15 |
|
Indy 10 - проблема
|
mailbrush |
С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby |
9 |
25.07.2009 16:56 |
|
[Delphi] Threads (проблема)
|
Flenov |
С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby |
11 |
17.03.2009 08:45 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|