AGB  ·  Datenschutz  ·  Impressum  







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

Dateiliste effektiv downloaden

Ein Thema von xZise · begonnen am 30. Mär 2008 · letzter Beitrag vom 3. Apr 2008
Antwort Antwort
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

Dateiliste effektiv downloaden

  Alt 30. Mär 2008, 15:05
Hallo DP,
ich habe eine Frage:
Und zwar programmiere ich einen Nachfolger von Quick Download (Qd).

Da man bei Qd meistens mehrere Dateien hat, möchte ich diese parallel downloaden.
Entweder lastet man seine Bandbreite besser aus, oder man entlastet die Server. (Je nach Downstream von einen selbst und den Upstream des Servers)

Wie macht man das nun am besten?
Zuerst habe ich gedacht: Machst du einfach mehere Threads (vom Benutzer einstellbar), welche alle auf die Liste zugreifen (threadsafe?) und diese durchgehen und überprüfen ob die Datei gedownloadet werden kann.
  • Vorteil:
    • Effektiv, da nur einmal Threads erstellt werden, diese nie suspenden müssen
    • Eine zentrale Stelle kann die Threads verwalten
    Nachteil:
    • Nicht umbedingt Threadsafe
    • Zwei Threadkritische Punkte: Zugriff auf die Liste und der Zugriff auf den Eintrag

Eine andere Möglichkeit wäre, dass jeder Eintrag selber seinen Thread verwaltet.
D.h. er wird zum startet des Downloads aufgefordert. Und er erstellt einen Thread füttert ihn mit den Werten und lässt ihn rennen.
Es gäbe dabei zwei verschiedene Möglichkeiten: Onrequest oder Oncreate. Bei wird der Thread erstellt, wenn der Thread benötigt wird, bei zweiterem existiert der Thread immer.
Ersteres freut den Ram, zweiteres freut den CPU.
  • Vorteil:
    • Von sich aus Threadsafe, da immer nur ein Thread pro Eintrag arbeitet
    Nachteil:
    • Benötigt mehr Ram (im Oncreate)
    • Möglicherweise längere "Arbeitszeiten", da die Threads erstellt werden müssen (im Onrequest)
    • Die Verwaltung stellt ein Problem da: Die Liste muss herausbekommen, wann ein neuer Thread gestartet werden kann

Nun wie würdet ihr das lösen?

MfG
xZise

PS: Zum ersteren habe ich schon eine Frage gestellt gehabt: [TCriticalSection] Teil einer Klasse auf die zugegriffen wird
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Dateiliste effektiv downloaden

  Alt 30. Mär 2008, 15:37
Ich würde die zweite Variante nehmen, da die längere Arbeitszeit und der Ramverbrauch durch das Erstellen eines Threads ja nun wirklich nicht der Rede wert ist.

Aber warum entlasten parallele Downloads den Server ?
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Dateiliste effektiv downloaden

  Alt 30. Mär 2008, 15:56
Okay, also ich habe vergessen zu erwähnen: Solange die Downloads verschiedene Server betrifft

Also wenn eine Datei von der einen Website stammt, und die andere von einer anderen Website, und beide sich nicht den Down-/Upstream teilen müssen kann ich meinen Bandbreite besser nutzen (ich habe 26 MBit/s), da die meißten Server zw. 300 kB/s und 1 MB/s anbieten. Oder für diejenigen, mit 6 Mb/s bringt es natürlich nicht so viel, hingegen wird dann nur weniger Upstream genutzt.
Wenn du Ubuntu benutzt (andere Distributionen kenne ich dahingehend nicht): Beim Update werden immer mehere Dateien gleichzeitig gedownloadet.

Ich tendiere auch eher zum zweiteren, aber wollte bzw. möchte weiterhin eure Meinung dazu wissen.

MfG
xZise

PS: Wenn du auch nur eine Datei gleichzeitig downloaden möchtest: Ich baue eine Option ein
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Dateiliste effektiv downloaden

  Alt 30. Mär 2008, 16:27
Eine Datei reicht bei meinen 384Kb/s wohl aus

Nochmal zu obiger Sache, ich glaube einfach, dass es der Aufwand die Vergabe der Aufträge Threadsave zu machen es nicht Wert ist.
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Dateiliste effektiv downloaden

  Alt 30. Mär 2008, 16:34
etwas threadsave machen ist ja nicht wirklich aufwand. Zugriff auf gemeinsame Objecte einfach in criticalSections packen und vcl-objecte müssen in einem Thread ja nicht wirklich sein da visuelle Sachen darin eigentlich nichts zu suchen haben.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Dateiliste effektiv downloaden

  Alt 30. Mär 2008, 17:03
Zitat von SirThornberry:
etwas threadsave machen ist ja nicht wirklich aufwand. Zugriff auf gemeinsame Objecte einfach in criticalSections packen und vcl-objecte müssen in einem Thread ja nicht wirklich sein da visuelle Sachen darin eigentlich nichts zu suchen haben.
Wie sieht das mit den auslesen von Daten aus?

Weil ein Thread würde folgendes machen:
Code:
Für i = 0 bis Liste.AnzahlEinträge - 1 mache
beginne
  wenn Liste.Eintrag[i].Status "sReady" ist dann
  beginne
    Setze "Liste.Eintrag[i].Status" auf "sDownloading"
    Starte den Download
  beende
beende
Wo müsste ich CriticalSections hinpacken?
Die Liste ist übrigens auch ein Objekt.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
gore

Registriert seit: 9. Jun 2006
Ort: Magdeburg
29 Beiträge
 
Delphi 7 Professional
 
#7

Re: Dateiliste effektiv downloaden

  Alt 3. Apr 2008, 09:37
Nur wo Du was änderst, was andere Threads auch ändern könnten, mußt Du CriticalSections einsetzen. Siehe Lost updates.
Also reine Leseoperationen müssen nicht mit CriticalSections geschützt werden.

Delphi-Quellcode:
EnterCriticalSection(LockList);
try
  Setze "Liste.Eintrag[i].Status" auf "sDownloading"
finally
  LeaveCriticalSection(LockList);
end;
MfG Bernd
  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 18:16 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