![]() |
Dateiliste effektiv downloaden
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.
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.
Nun wie würdet ihr das lösen? MfG xZise PS: Zum ersteren habe ich schon eine Frage gestellt gehabt: ![]() |
Re: Dateiliste effektiv downloaden
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 ? |
Re: Dateiliste effektiv downloaden
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 ;) |
Re: Dateiliste effektiv downloaden
Eine Datei reicht bei meinen 384Kb/s wohl aus :mrgreen:
Nochmal zu obiger Sache, ich glaube einfach, dass es der Aufwand die Vergabe der Aufträge Threadsave zu machen es nicht Wert ist. |
Re: Dateiliste effektiv downloaden
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.
|
Re: Dateiliste effektiv downloaden
Zitat:
Weil ein Thread würde folgendes machen:
Code:
Wo müsste ich CriticalSections hinpacken?
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 Die Liste ist übrigens auch ein Objekt. MfG xZise |
Re: Dateiliste effektiv downloaden
Nur wo Du was änderst, was andere Threads auch ändern könnten, mußt Du CriticalSections einsetzen. Siehe
![]() Also reine Leseoperationen müssen nicht mit CriticalSections geschützt werden.
Delphi-Quellcode:
MfG Bernd
EnterCriticalSection(LockList);
try Setze "Liste.Eintrag[i].Status" auf "sDownloading" finally LeaveCriticalSection(LockList); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz