AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Download (Thread)

Ein Thema von devnull · begonnen am 4. Mär 2004 · letzter Beitrag vom 5. Mär 2004
Antwort Antwort
Benutzerbild von devnull
devnull

Registriert seit: 5. Okt 2003
362 Beiträge
 
Delphi 7 Personal
 
#1

Download (Thread)

  Alt 4. Mär 2004, 18:38
Hi,
ich versuche, während der Laufzeit meines Programms über eine "Live-Update"-Funktion neuere Versionen desselbigen
Progrs herunterzuladen. Dazu verwende ich einen Thread.

Aufgerufen wird die ganze Prozedur mit
DownloadThread :=
TDownloadThread.Create('programmname',pos+'\NewVer sion_'+internet_ver+'.exe',server_adress+updatepos );


Das Problem ist, dass die heruntergeladene Datei sich nicht öffnen lässt (fehlende Bytes oä.).
Wenn man erneut auf Download/Update klickt, kommt gleich die Meldung "Download fertiggestellt", obwohl
das Prog noch nich mal angefangen hat, etwas zu laden.


Bitte helft mir
devnull
Angehängte Dateien
Dateityp: txt threadunit.txt (4,9 KB, 44x aufgerufen)
-- Never change a running system --
  Mit Zitat antworten Zitat
Benutzerbild von devnull
devnull

Registriert seit: 5. Okt 2003
362 Beiträge
 
Delphi 7 Personal
 
#2

Re: Download (Thread)

  Alt 5. Mär 2004, 12:25
weis keiner was ??? muss man vielleicht den thread (download...) irgenwie schließen / beenden ?
-- Never change a running system --
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Download (Thread)

  Alt 5. Mär 2004, 12:48
Ich arbeite seit Kurzem auch damit (UrlDownloadtoFile). Und es geht super, allerdings nicht in 'nem eigenem Thread. An den Thread dürfte es aber nicht liegen.

Du darfst dabei aber nicht vergessen, das diese Download-Art vorrangig die Datei-Kopie aus dem IE-Cache verwendet. Wenn du also ein zweite Mal startest geht es natürlich viel schneller.

Bei mir was es aber auch manchmal so, das einige Dateien nicht vollständig auf den Server hochgeladen wurden (einige GIF's) und daher auch nicht vollständig runtergeladen werden konnten. Zusätzlich befand sich manchmal noch eine alte Kopie der Datei in IE-Cache und unter bestimmten Voraussetzungen lädt das Teil dann nicht dir neue Version runter, sondern verwendet weiterhin das alte Teil.

Diese beiden Probleme (alte/defekte Dateien) hab ich mit Hilfe eines Hashvergleichs beseitigt.

Auf dem Server befinden sich 2 Hash-Listen. Einmal die Liste der Dateien für das Update und noch eine kleine zur Kontrolle das Hash-Liste.

Nach dem Download jeder Datei wird diese geprüft und bei einem Fehler nochmal geladen ...
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von devnull
devnull

Registriert seit: 5. Okt 2003
362 Beiträge
 
Delphi 7 Personal
 
#4

Re: Download (Thread)

  Alt 5. Mär 2004, 13:35
danke für deine aw.

wie bekomm ich den hash-wert einer datei raus ? gibts da irgendwo ne funktion oder so ?
-- Never change a running system --
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Download (Thread)

  Alt 5. Mär 2004, 13:50
Da brauchst du hier nur mal nach Hier im Forum suchenHash suchen, da gibt es 'ne Menge.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#6

Re: Download (Thread)

  Alt 5. Mär 2004, 14:19
Hallo devnull,

das ist alles äusserst schlecht, was Du da machst.
Wenn Du urlDownloadFile in einem Thread aufrufst, wird auf DownloadThread.UpdateForm1; in diesem Thread aufgerufen.
Und da Du in UpdateForm auf die VCL zugreifst (Buttons, Labels) MUSS dieser Aufruf mit Synchronize erfolgen.!
Undbedingt.
Noch viel Besser wäre natürlich, wenn Du ein Update Event einrichtest.
Was ist, wenn Du diesen DownloadThread nochmal verwenden willst, aber z.B. mit einem ganz anderen Form ?

Du solltest Dir also ein Status Event einrichten. Und das aktualisieren von Buttons übernimmt das FORM SELBER !

TDownStatusEvent = procedure( sender : Tobject; progress, progressmax, status : integer) of object;

Nun zu Deinem Problem.

Das

Code:
BINDSTATUS_ENDDOWNLOADDATA : begin
        PagesDlg1.Label4.Caption := 'Download "'+fileinfo+'" fertiggestellt ...';
        DownloadThread.UpdateForm1;
    end;
ist nur ne MEldung, da ist Dein Download noch nicht zu ENDE.

Du musst also in BINDSTATUS_ENDDOWNLOADDATA eine Variable "FERTIG" setzen.
Und dann

Code:
try
   UrlDownloadtoFile(nil, PCHAR(runterladen), PCHAR(speichernals), 0, CDownStatus);
  if not abgebrochen or sonstwas and fertig then
   begin
    if MessageDlg ('Programm beenden und Update entpacken ?',mtConfirmation,[mbYes,mbNo],0)
        = mrNo then exit;
    ShellExecute(self.Handle, NIL, pchar(speichernals),'','',SW_SHOWNORMAL);
    halt;
   end;


  finally
    cDownStatus.Free;
  end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz