problem ze ściąganiem plików

0

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

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żą!

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