Witam
Jak w delphi zatrzymać całkowicie wątek (czyt. usunąć?) i ponownie go utworzyć - tak jakby był on uruchamiany za pierwszym razem? Do "zatrzymywania" używam watek.Suspend a do utworzenia watek := Twatek.Create(False); - jednakże po ponownym uruchomieniu wątku nie działa mi on w pełni. Myślałem nad watek.Terminate; i w wątku dać while not Terminate and Application.Terminate ale niestety - w takiej sytuacji wątek cały czas się wykonuje a powinien się zatrzymać po wykonaniu zadania.
0
0
nie masz podstaw a bierzesz się za jeden z najtrudniejszych elementów programowania - wielowątkowość. Uzupełnij najpierw braki w podstawach
0
Właśnie chcę je uzupełnić. Wątek jest mi potrzebny jedynie do pobrania strony przez komponent idhttp pakietu indy, a niestety bez wątku program się "przycina".
0
Nikt nie pomoze?
0
Zamiast Watek.Suspend;
użyj Watek.Free;
.
0
Masz przykład taki nie do końca przemyślany, bez sprawdzania pewnych koniecznych warunków (bo to tylko przykład) itd. ale jednak działający i robiący to o co (chyba?) Ci chodzi w btnReloadClick.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdComponent, IdHTTP, ComCtrls;
type
TSetProgress = procedure (Sender: TObject; Current, Total: Integer) of object;
TDownThread = class (TThread)
private
fSetProgress: TSetProgress;
fCanceled: Boolean;
fIdHTTP: TIdHTTP;
fFileName: string;
fFileUrl: string;
fCurrentDow: Integer;
fTotalDow: Integer;
procedure WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer);
procedure Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
procedure DoSetProgress;
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy; override;
procedure Start;
procedure Cancel;
published
property FileName: string read fFileName write fFileName;
property FileURL: string read fFileURL write fFileURL;
property OnSetProgress: TSetProgress read fSetProgress write fSetProgress;
end;
TForm1 = class(TForm)
btnStart: TButton;
btnReload: TButton;
ProgressBar1: TProgressBar;
procedure btnStartClick(Sender: TObject);
procedure btnReloadClick(Sender: TObject);
procedure StartDownload;
private
{ Private declarations }
dt: TDownThread;
procedure OnProgress(Sender: TObject; Current, Total: Integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TDownThread.DoSetProgress;
begin
OnSetProgress(Self, fCurrentDow, fTotalDow);
end;
procedure TDownThread.WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Integer);
begin
fTotalDow:= AWorkCountMax;
end;
procedure TDownThread.Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Integer);
begin
if fCanceled then
raise EAbort.Create(''); //nie ma co sie piescic
if Assigned(OnSetProgress) and (AWorkMode = wmRead) then
begin
fCurrentDow:= AWorkCount;
Synchronize(DoSetProgress)
end;
end;
procedure TDownThread.Execute;
var
fFS: TFileStream;
begin
fFS:= TFileStream.Create(fFileName, fmCreate or fmOpenWrite);
try
try
fIdHTTP.Get(fFileUrl, fFS);
except
on E: EAbort do
begin
fFS.Size:= 0;
if (not Terminated) then
Terminate;
end;
on E: Exception do
begin
if (not Terminated) then
Terminate;
ShowMessage(E.Message);
end;
end;
finally
fFS.Free;
end;
end;
constructor TDownThread.Create;
const
UA = 'Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0';
begin
inherited Create(True);
Self.FreeOnTerminate:= True;
fCanceled:= False;
fIdHTTP:= TIdHTTP.Create();
fIdHTTP.HandleRedirects:= True;
fIdHTTP.Request.UserAgent:= UA;
fIdHTTP.OnWorkBegin:= WorkBegin;
fIdHTTP.OnWork:= Work;
end;
destructor TDownThread.Destroy;
begin
fCanceled:= True;
if fIdHTTP.Connected then
fIdHTTP.Disconnect;
fIdHTTP.Free;
inherited Destroy;
end;
procedure TDownThread.Start;
begin
Self.Resume;
end;
procedure TDownThread.Cancel;
begin
fCanceled:= True;
end;
procedure TForm1.OnProgress(Sender: TObject; Current, Total: Integer);
begin
ProgressBar1.Max:= Total;
ProgressBar1.Position:= Current;
end;
procedure TForm1.StartDownload;
const
DOWNLOAD_URL = 'http://download.winzip.com/winzip160.exe';
DOWNLOAD_FILE = 'F:\winzip160.exe';
begin
ProgressBar1.Position:= 0;
dt:= TDownThread.Create;
dt.FileURL:= DOWNLOAD_URL;
dt.FileName:= DOWNLOAD_FILE;
dt.OnSetProgress:= OnProgress;
dt.Start;
end;
procedure TForm1.btnStartClick(Sender: TObject);
begin
StartDownload;
end;
procedure TForm1.btnReloadClick(Sender: TObject);
var
ThreadHandle: THandle;
begin
ThreadHandle:=dt.Handle;
dt.Cancel;//zakoncz watek (przerwij pobieranie)
WaitForSingleObject(ThreadHandle, INFINITE); //poczekaj jezeli trzeba na zakonczenie
StartDownload; //utworz nowy
end;
end.