Avatar billede dallan2007 Nybegynder
17. maj 2009 - 22:33 Der er 6 kommentarer og
1 løsning

Download stor fil fra nettet.

Jeg er godt nok ved at opgive her...

Jeg skal bruge en funktion som kan:

- downloaded en stor (+50MB) fil fra nettet.
- ikke får programmet til at fryse
- giver mulighed for at se hvor langt man er kommet.

Indy/idHTTP#
Virker kanont og kan alt hvad jeg skal bruge, bare ikke hente netop fra det sted der skal hentes fra. Underligt, irriterende og særdeles træls.

GetInetFile#
Kan hente fra stedet hvor idHTTP har givet op, men får hele programmet til ar fryse indtil download er færdig. Og jeg aner ikke hvordan jeg kan lave statusopdateringer undervejs.

URLDownloadToFile#
Kan hente fra stedet hvor idHTTP har givet op, og der er halvdårlig opdatering, men får hele programmet til ar fryse indtil download er færdig.

Hvis bare jeg kan få GetInetFile eller URLDownloadToFile til ikke at fryse og har mulighed for at arbryde download undervejs så vil være rigtig fint. Tvivler på det sådan lige kan lade sig gære.


Alt hjælp er velkommen. Bruger Delphi6.

Rgs
Allan
Avatar billede julemandenb Nybegynder
17. maj 2009 - 22:41 #1
Flashget kan hentes gratis fra den berømte hjemmeside som alle kender nemlig google :D

Flashget holder din downloads igang Dvs, mister du internetforbindelsen og er noget til 54% jamen så "Pauser" den din downloads og forsætter automatisk når der er net igen,
Avatar billede arne_v Ekspert
17. maj 2009 - 22:44 #2
Hvis nogle af dem fryser betyder det vel at du kører downloaden blocking i event tråden.

Hvis du starter en separat tråd til det burde din GUI stadig svare.
17. maj 2009 - 23:04 #3
Jeg downloader jævnlig filer på 50-70 MB uden problemer.
Her et par uddrag af koden.

procedure TForm97.DownLoad(Source, Dest: String);
begin  // http://www.eksperten.dk/spm/676435.
  try
    IdFTP.Host    := Global.HentNogleVardi('wwwHjemmeside'); 
    IdFTP.Username := Global.HentNogleVardi('wwwBrugernavn'); 
    IdFTP.Password := Global.HentNogleVardi('wwwAdgangskode'); 
    IdFTP.Connect;
    IdFTP.ChangeDir('/www/udsendelser/'); //skift evt. dir
    FilLen := IdFTP.Size(Source);
    ProgressBar1.Max := FilLen;
    Application.ProcessMessages;
    StartTid := Time;
    TickStart := GetTickCount;
    IdFTP.Get(Source, Dest, True);
    IdFTP.Disconnect;
    Label2.Caption := 'Færdig ' + IntToStr(SecondsBetween(Time, StartTid)) + ' sekunder.';
  except
    on E: Exception do
    begin
      Application.MessageBox(PChar('Der er opstået en fejl. Fejl: '+E.Message),'Fejl',MB_OK or MB_ICONERROR);
    end;
  end;
end;

Så sætter jeg en event på IdFtp OnWork

procedure TForm97.IdFTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
var
  Rest: Real;
begin
  ProgressBar1.Position := AWorkCount;
  try
    Rest := (FilLen - AWorkCount) / (AWorkCount / SecondsBetween(Time, StartTid));
  except
    on E: Exception do
      Rest := 0;
  end;
  DlCount := DlCount + 1;
  DlRest := DlRest + Rest;
  if (GetTickCount - TickStart) >= 1000 then // For hvert sekund
  begin
    Label2.Caption := 'Forventet resterende tid: ' + IntToStr(Round(DlRest / DlCount)) + ' sekunder';
    TickStart := GetTickCount;
    DlRest := 0;
    DlCount := 0;
    Label3.Caption := IntToStr(AWorkCount) + ' af ' + IntToStr(FilLen) + ' bytes overført.';
    Application.ProcessMessages;
  end;
end;

Læg mærke til tredie sidste linie:   
    Application.ProcessMessages;
Den sørger for at programmet ikke fryser.

Jeg har en ProgressBar som opdares med:
  ProgressBar1.Position := AWorkCount;

Resten at rutinen viser brugt og forventet resterende tid.
Avatar billede dallan2007 Nybegynder
18. maj 2009 - 08:47 #4
# julemandenb - læs topic ;)

# arne_v - hvordan gør man lige det?

# anton_kruse_andersen - det er kun til ftp via username/password. Det jeg skal bruge er til http.
Avatar billede dallan2007 Nybegynder
18. maj 2009 - 13:25 #5
Det kan ikke lade sig gøre - lukker.
Avatar billede arne_v Ekspert
19. maj 2009 - 01:26 #6
Du kan godt downloade i en separat tråd.
Avatar billede dallan2007 Nybegynder
19. maj 2009 - 13:53 #7
Mnej.... har prøvet på så mange måder nu, at jeg må konkludere, at det ikke kan lade sig gøre fra min specifikke side.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester