|
#1
|
|||
|
|||
Потоки help
все походу...
Код:
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,idhttp; type TMyThread = class(TThread) private FUrl: string; public constructor Create(CreateSuspended: Boolean; AUrl: string); protected procedure Execute; override; procedure UpdateCaption; end; implementation uses Unit1; { Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TMyThread.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; } { TMyThread } constructor TMyThread.Create(CreateSuspended: Boolean; AUrl: string); begin inherited Create(CreateSuspended); FUrl := AUrl; FreeOnTerminate := true; end; procedure TMyThread.Execute; var http: TIdHTTP; str: TStringList; begin str := TStringList.Create(); http := TIdHTTP.Create(nil); str.Text:= http.Get(FUrl); str.SaveToFile(inttostr(random(222))+'.html'); http.Free; str.free ; sleep(5000); Synchronize(UpdateCaption); end; procedure TMyThread.UpdateCaption; begin Form1.Memo2.Lines.Add(FUrl); end; end. Admin: Учимся пользоваться тегами! Последний раз редактировалось Admin, 24.01.2010 в 22:02. |
#2
|
|||
|
|||
Ну все правильно. Ты же используешь всего один компонент для скачивания. Если ты хочешь распаралелить работу, то создавай IdHTTP в каждом потоке свой.
|
#3
|
|||
|
|||
при нажатии на кнопку создаеться столько потоков сколько существует записей в memo1
допустим я создал 50 потоков. 1)как мне остановить вручнудю все эти 50 потоков и удалить их? 2)чтобы потоки удалились нужно в конце писать self.Terminate; self.free; ? или он сам удаляеться 3)как остановить например только 10-ый поток? подскажите пожалуйса. Код:
procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin for i := 0 to Memo1.Lines.Count - 1 do begin TMyThread.Create(false, Memo1.lines[i]); end; end; Код:
type TMyThread = class(TThread) private FUrl: string; public constructor Create(CreateSuspended: Boolean; AUrl: string); protected procedure Execute; override; procedure UpdateCaption; end; implementation uses Unit1; constructor TMyThread.Create(CreateSuspended: Boolean; AUrl: string); begin inherited Create(CreateSuspended); FUrl := AUrl; FreeOnTerminate := true; end; procedure TMyThread.Execute; var http: TIdHTTP; str: TStringList; begin str := TStringList.Create(); http := TIdHTTP.Create(nil); str.Text:= http.Get(FUrl); sleep(7000); str.SaveToFile(inttostr(random(222))+'.html'); http.Free; str.free ; Synchronize(UpdateCaption); // self.Terminate; //self.free; end; procedure TMyThread.UpdateCaption; begin Form1.Memo2.Lines.Add(FUrl); end; Последний раз редактировалось Admin, 24.01.2010 в 22:03. |
#4
|
|||
|
|||
Весь вопрос: что значит остановить? Если вы хотите чтобы они нормально ликвидировались когда они сами отработают, то установите свойство FreeOnTerminate в true, а если при каких то условиях то можно попробовать использовать TEvent, временный тормоз потока это метод suspend, а чтобы его разрушить лучше вызвать destroy как и для любого другого объекта по моему
|