допустим есть код: Code: 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 паралельно его выполняли? пытался примерно вот так: Code: 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
Создавай все компоненты в Execute перед выполнением работы а не в процедурах. И уничтожай потом в Destroy или где там у тебя завершение. И делай синхронизацию потоков с формой. Ты можешь в литровую банку сразу 5 рук засунуть? З.Ы. И что у тебя за бред с созданием TStringList? Он у тебя создаётся по сто раз и ни разу не уничтожается!
1) Synchronize 2) объект TIdHTTP сделай локальным для потока Если руки кривые, обычно так и делают =)
Code: tnew = class(tthread) private idHTTP:TIdHTTP; procedure getln; protected procedure execute; override; end;
блин, пример как создавать в tform1.button1click добавить это? new1.idHTTP=idhttp.create; (или как там правильно создавать?) new2.idHTTP=idhttp.create; newN.idHTTP=idhttp.create;
IdHttp надо создавать в конструкторе класса потока..и уничтожать в деструкторе (хотя так и не обязательно, у меня например idhttp и потоки существуют независимо друг от друга, у меня что-то вроде многопоточной очереди) ТС я тебе советую сначала почитать про классы, научится их писать самому, иначе тебе придется ой как трудно в создании мультитредных сетевых аппликаций
Можно даже ничего не синхронизировать.А если надо упорядочить доступ к каким то общим данным то крит.секций будет вполне достаточно. за то rfc знать не будешь
А крит секции это не синхронизация? Низачод, сморозил чушь, а теперь чтобы оправдаться вообще загнался Что-то мне сдается что юный фанатик дельфей старше тебя
создаю Code: 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? что я делаю не так?
cook := TIdCookieManager.Create(nil); И мля, нах не надо его вообще создавать то просто http.AllowCookies := True; и все Ты все делаешь не так form1.idcookiemanager1.Create(http); что это за конструкотр такой? ты пытаешься создать объект другим компонентом?
1n0y, нельзя в потоке просто так использовать компоненты с формы. Создавай компоненты конкретно в самом потоке! Вот что-то тип такого: Code: TMyThread = class(TThread) private FCS: RTL_CRITICAL_SECTION; FH TidHTTP; FS: TIdIOHandlerStack; CM: TIdCookieManager; ... protected procedure Execute; override; ... public constructor Create; destructor Destroy; override; .... .... procedure TMyThread.Execute; var text:string; begin {} FH := TidHTTP.Create; FS := TIdIOHandlerStack.Create; CM := TidCookieManager.Create; {--//--} FH.IOHandler := FS; FH.HandleRedirects := true; FH.CookieManager := CM; FH.AllowCookies := true; ... text := FH.Get(''); ... end; constructor TMyThread.Create; begin inherited Create(True); ... FreeOnTerminate := False; InitializeCriticalSection(FCS); Resume; end; destructor TMyThread.Destroy; begin FreeAndNil(FH); FreeAndNil(FS); FreeAndNil(CM); DeleteCriticalSection(FCS); end;