Witam w jaki sposób ściągać z internetu więcej plików w tym samym czasie.
Próbowałem użyć do tego przykładu z http://4programmers.net/Delphi/Artyku%C5%82y/%C5%9Aci%C4%85ganie_plik%C3%B3w_-_doko%C5%84czenie_transferu wszystko wrzuciłem do wątku lecz caly czas maksymalnie ściagało mi dwa pliki
0
0
dość często serwer blokuje możliwość ściągania więcej niż dwóch plików naraz. dwa oznacza ściąganie pliku + dalsze przeglądanie strony, stąd akurat taka liczba.
0
tylko przy ściąganiu z kilku serwerów też nie działa
0
pokaż swój kod, bo to w nim leży problem.
dla każdego pliku tworzysz nowy wątek, a nie jeden wątek na wszystkie ściągania.
0
tak tez robię
type
TDownloadTheard = class(TThread)
public
AdresURL : String;
NazwaPliku : String;
protected
procedure Execute; override;
procedure SetProprties;
end;
procedure TDownloadTheard.Execute;
begin
FreeOnTerminate := True;
Synchronize(SetProprties);
end;
procedure TDownloadTheard.SetProprties;
var
plik :File;
inOpen,inURL :HINTERNET;
rozmiar,ileZnakow,rozmiarPliku :DWord;
dwBufLen, dwIndex, sciagnieto :DWord;
bufor :array[1..1024] of byte;
buf :Pointer;
stop : boolean;
Begin
//ustawiamy dane...
inOpen:= nil; inURL:= nil;
rozmiarPliku:= 0;
rozmiar:= 0;
ShowMessage(adresURL);
Stop := false;
if FileExists(nazwaPliku) then
begin
AssignFile(plik, nazwaPliku);
Reset(plik, 1);
rozmiarPliku:= FileSize(plik); //pobieramy rozmiar pliku
Seek(plik, FileSize(plik)); //ustawiamy skażnik na końcu pliku
end
else
begin
AssignFile(plik,nazwaPliku);
ReWrite(plik, 1);
end;
try
inOpen:= InternetOpen('Mozilla',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0);
inURL:= InternetOpenURL(inOpen,PChar(adresURL),'Accept: */*', StrLen('Accept: */*'),0,0);
if not (inURL <> nil) then
begin
ShowMessage('Nie można uzyskać połączenia');
InternetCloseHandle(inURL);
InternetCloseHandle(inOpen);
CloseFile(plik);
Exit;
end;
dwIndex:= 0;
dwBufLen:= 1024;
GetMem(Buf, dwBufLen);
HttpQueryInfo(inURL, HTTP_QUERY_CONTENT_LENGTH,buf, dwBufLen,dwIndex);
rozmiar:= StrToInt(StrPas(Buf));
if rozmiarPliku > 0 then InternetSetFilePointer(inURL,rozmiarPliku,nil,0,0);
while (ileZnakow <> 0) and (Stop = false) do
begin
InternetReadFile(inURL, @bufor, SizeOf(bufor),ileZnakow);
InternetQueryDataAvailable(inURL,rozmiar, 0, 0);
BlockWrite(plik, bufor,ileZnakow);
sciagnieto:= FileSize(plik);
end;
except
ShowMessage('Wystąpił błąd podczas ściągania pliku !');
Stop:= True;
InternetCloseHandle(inURL);
InternetCloseHandle(inOpen);
CloseFile(plik);
Exit;
end;
Stop:= False;
InternetCloseHandle(inURL);
InternetCloseHandle(inOpen);
CloseFile(plik);
Beep;
end;
Potem
procedure TForm1.Button1Click(Sender: TObject);
var
DownloadTheard:TDownloadTheard;
Begin
DownloadTheard:=TDownloadTheard.Create(true);
DownloadTheard.AdresURL:=Edit1.text;
DownloadTheard.NazwaPliku:=Edit2.text;
DownloadTheard.Resume;
end;
0
procedure TDownloadTheard.Execute;
begin
FreeOnTerminate := True;
Synchronize(SetProprties);
end;
wiesz co robi synchronize? wykonuje metodę w kontekście głównego wątku. jak chcesz wykonywać dwa synchronize naraz? główny wątek jest jeden.
cholera, nie używaj metod, co do których nie masz pojecia do czego służą!