Wątek i Idhttp

0

Witam..
Ostatnio pisze program który będzie ściągał pliki z internetu, chciałem proces ściągania przenieść do wątku.
Żeby ściągnąć dany plik muszę mieć zawarte nagłówki i cookie także padło na id http, napisałem taki testowy kodzik lecz nie wiem czemu aplikacja lekko mi się tnie?. Możecie mi pomóc w tej sprawie lub doradzić co robię zle ?
Pozdrawiam..

 
type
  TWatek = class(TThread)
  private
    Answer: integer;
    WebBrowser1: TWebBrowser;
   // ht : TIdHTTP;
   // ms: TMemoryStream;
  protected
    procedure Execute; override;
    procedure Terminate(Sender: TObject);
    procedure Download;
  public

   constructor Create;

  end;

var
  Form1: TForm1;
  Watek : TWatek;
implementation

{$R *.dfm}  

constructor TWatek.Create;
begin
  inherited Create(False);
  OnTerminate := Terminate;
end;

procedure TWatek.Terminate(Sender: TObject);
begin
  Form1.Caption:='koniec';
end;

procedure Twatek.Download;
var
ms: TMemoryStream;
ht : TIdHTTP;
begin
  ht := TIdHTTP.Create(nil);
  ms := TMemoryStream.Create;

  ht.OnWorkBegin:=Form1.htttpWorkBegin;
  ht.OnWork:=Form1.htttpWork;
  ht.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)';
  ht.Get('http://x-software.com.pl/up/rar/Katalogi2.rar', ms);
  ms.SaveToFile('c:\ff.rar');
end;

procedure TWatek.Execute;
begin
FreeOnTerminate := True;
Synchronize(Download);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Watek:=TWatek.Create();
end;



0

Może najpierw poczytaj cokolwiek o programowaniu wielowątkowym. Wiesz co robi Synchronize? - nie to też przeczytaj. Taka mała podpowiedź - nic z tego kodu nie wykonuje się w osobnym wątku.

0

Skąd jesteś pewny, że ci się tnie ?
Może program musi ustanowić połączenie z serwerem i stąd to odczekanie.

0

Witam..
Poprawiłem teraz jest niby ok.. eh trochę ciężko mi zrozumieć te wątki a w necie trochę mało informacji i przykładów :)

 
type
  TWatek = class(TThread)
  private
  protected
    procedure Execute; override;
    procedure Terminate(Sender: TObject);
    procedure htWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
    procedure htWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
  public
    max : Integer;
   constructor Create;
  end;

var
  Form1: TForm1;
  Watek : TWatek;
implementation

{$R *.dfm}
//// - constructor -
constructor TWatek.Create;
begin
  inherited Create(False);
  OnTerminate := Terminate;
end;
//// - terminate -
procedure TWatek.Terminate(Sender: TObject);
begin
  Form1.Caption:='koniec';
end;
//// - htWorkBegin -
procedure TWatek.htWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
max:=AWorkCountMax;
end;
//// - htWork -
procedure TWatek.htWork(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
var
Total: Integer;
begin
  if (AWorkMode=wmRead) then
  begin
  Application.ProcessMessages;
  Total:=Round((AWorkCount / Max) * 100);
  TEdit(Form1.FindComponent('Edit1')).Text :=IntToStr(Total);
  end;
end;
//// - Execute -
procedure TWatek.Execute;
var
ms: TMemoryStream;
ht : TIdHTTP;
begin
  FreeOnTerminate := True;
  ht := TIdHTTP.Create(nil);
  ms := TMemoryStream.Create;

  ht.OnWorkBegin:= htWorkBegin;
  ht.OnWork:=htWork;

  ht.Request.UserAgent:='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)';
  ht.Get('http://x-software.com.pl/up/rar/Katalogi2.rar', ms);
  ms.SaveToFile('c:\ff.rar');
end;
//// - Button1 -
procedure TForm1.Button1Click(Sender: TObject);
begin
Watek:=TWatek.Create();
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Watek.Suspend;
end;


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