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

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   потоки и indy [delphi] (https://forum.antichat.xyz/showthread.php?t=198556)

1n0y 23.04.2010 14:30

потоки и 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

ange007 23.04.2010 14:38

Создавай все компоненты в Execute перед выполнением работы а не в процедурах.
И уничтожай потом в Destroy или где там у тебя завершение.
И делай синхронизацию потоков с формой.
Ты можешь в литровую банку сразу 5 рук засунуть?

З.Ы. И что у тебя за бред с созданием TStringList?
Он у тебя создаётся по сто раз и ни разу не уничтожается!

M_script_ 23.04.2010 14:39

1) Synchronize
2) объект TIdHTTP сделай локальным для потока

Цитата:

Ты можешь в литровую банку сразу 5 рук засунуть?
Если руки кривые, обычно так и делают =)

1n0y 23.04.2010 15:02

Цитата:

Сообщение от ange007
Создавай все компоненты в Execute перед выполнением работы а не в процедурах.
И уничтожай потом в Destroy или где там у тебя завершение.
З.Ы. И что у тебя за бред с созданием TStringList?
Он у тебя создаётся по сто раз и ни разу не уничтожается!

спасибо, учту.

ды это примерный код, я его тут и придумал (: главное - айдихттп



Цитата:

Сообщение от M_script_
2) объект TIdHTTP сделай локальным для потока

2) пример можно? :)

ange007 23.04.2010 15:09

Цитата:

Сообщение от 1n0y
2) пример можно? :)

Код:

tnew = class(tthread) 
private 
idHTTP:TIdHTTP;
procedure getln; 
protected 
procedure execute; override;
end;


cheater_man 23.04.2010 15:10

один из простых вариантов юзать MPI :)

1n0y 23.04.2010 15:15

блин, пример как создавать :)
в tform1.button1click добавить это?

new1.idHTTP=idhttp.create; (или как там правильно создавать?)
new2.idHTTP=idhttp.create;
newN.idHTTP=idhttp.create;

1n0y 23.04.2010 15:16

Цитата:

Сообщение от cheater_man
один из простых вариантов юзать MPI :)

"Существуют реализации для языков Фортран 77/90, Си и Си++." :mad:

GhostOnline 23.04.2010 15:32

IdHttp надо создавать в конструкторе класса потока..и уничтожать в деструкторе (хотя так и не обязательно, у меня например idhttp и потоки существуют независимо друг от друга, у меня что-то вроде многопоточной очереди)
ТС я тебе советую сначала почитать про классы, научится их писать самому, иначе тебе придется ой как трудно в создании мультитредных сетевых аппликаций

_nic 23.04.2010 15:48

С сокетами легче синхронизировать ;)


Время: 17:34