Witam! Chciałem napisać aplikacje która pobiera jednocześnie kilka plików z internetu przy użyciu
idhttp. Stworzyłem watek o nazwie TPobieranie w którym jest tworzony idhttp. Do idhttp.onwork (wwwclient.OnWork) przypisuje
procedure TPobieranie.sciaganie która tez jest wątku i jak chce pobrać w tej procedurze dane do zmiennej nr_pobieranego22 ze zmiennej nr_pobieranego w watku to wywala mi blad Access Violation at address..... Nie wiem czemu sie tak dzieje.
TPobieranie = class(TThread)
private
adres_www : string;
nr_pobieranego:integer;
wwwclient : TIdHttp;
protected
procedure Execute; override;
procedure start_pobierania(Sender: TObject;AWorkMode: TWorkMode;const AWorkCountMax: Integer);
procedure sciaganie(Sender: TObject;AWorkMode: TWorkMode;const AWorkCount: Integer);
end;
procedure TPobieranie.start_pobierania(Sender: TObject;AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
var
nr_pobieranego22:integer;
begin
nr_pobieranego22:=nr_pobieranego;
STime := Now;
Form1.StringGrid2.Cells[2,tablica_pobierania[nr_pobieranego22].linia]:=FormatFloat('0.00 KB',AWorkCountMax/1024);
end;
procedure TPobieranie.sciaganie(Sender: TObject;AWorkMode: TWorkMode;
const AWorkCount: Integer);
var
speed : extended;
TotalTime:TDateTime;
H, M, Sec, MS : word;
DLTime : Double;
nr_pobieranego22:integer;
begin
nr_pobieranego22:=nr_pobieranego;
Form1.StringGrid2.Cells[3,tablica_pobierania[nr_pobieranego22].linia]:=FormatFloat('0.00 KB',AWorkCount/1024);
tablica_pobierania[nr_pobieranego22].pobrano:=AWorkCount;
Form1.StringGrid2.Refresh;
TotalTime := Now - STime;
DecodeTime(TotalTime, H, M, Sec, MS);
DLTime := (M*60)+(Sec + (MS / 1000));
if (DLTime > 0) and (AWorkCount>0) then
begin
Speed :=(AWorkCount / 1024) / DLTime;
Form1.StringGrid2.Cells[5,tablica_pobierania[nr_pobieranego22].linia]:=FormatFloat('0.00 KB/s',Speed);
end;
end;
procedure TPobieranie.execute;
var
dane: TMemoryStream;
x:integer;
begin
FreeOnTerminate := True;
dane := TMemoryStream.Create;
wwwclient := TIdHttp.Create(nil);
wwwclient.HandleRedirects:=true;
wwwclient.Request.ContentType :='application/x-www-form-urlencoded';
@wwwclient.OnWork:[email protected];
@wwwclient.OnWorkBegin:[email protected]_pobierania;
wwwclient.Host:='http://www.strona.pl/';
Form1.StringGrid2.Cells[4,tablica_pobierania[nr_pobieranego].linia]:='łączenie..';
wwwclient.Connect(5000);
Form1.StringGrid2.Cells[4,tablica_pobierania[nr_pobieranego].linia]:='pobieranie';
wwwclient.Get(adres_www,dane);
dane.SaveToFile('C:\plik.rar');
Form1.StringGrid2.Cells[4,tablica_pobierania[nr_pobieranego].linia]:='pobrano';
dane.Free;
wwwclient.Free;
end;
procedure TForm1.Button9Click(Sender: TObject);
var
Pobieranie : TPobieranie;
begin
Pobieranie := TPobieranie.Create(true);
Pobieranie.nr_pobieranego:=1;
Pobieranie.adres_www:='http://www.strona.pl/plik.rar';
Pobieranie.Resume;
end;
Błąd mi wywala w procedurach TPobieranie.start_pobierania i TPobieranie.sciaganie w lini nr_pobieranego22:=nr_pobieranego;
Prosze o pomoc.