procedury w wątku i kopiowanie wartości zmiennych

0

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.
0

synchronizacja, sekcje krytyczne - wybieraj

0

jak dodam do

TPobieranie.execute

Synchronize(sciaganie);
Synchronize(start_pobierania);

to wyskakuje błąd:

Error] Unit1.pas(230): There is no overloaded version of 'Synchronize' that can be called with these arguments
[Error] Unit1.pas(231): There is no overloaded version of 'Synchronize' that can be called with these arguments
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

0

użyj F1 i poczytaj jak działa Synchronize()... w parametrach podajesz metodę, która nie przyjmuje argumentów!
naprawdę, w helpie zdarzają się przydatne informacje. dlatego właśnie help tak się nazywa.

0

dalej nie wiem co zrobić :( pomocy

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