Zatrzymanie wątku i ponowne jego utworzenie (nie wznowienie)

0

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1