Downloadmanager Code-Design



  • Hey,

    ich würde gerne einen kleinen Downloadmanager schreiben, aber stehe da vor einigen Problemen. Als GUI-Framework würde ich gerne wxWidgets nutzen.

    Dabei möchte ich gerne mehrere Downloads gleichzeitig unterstützen. Den Downloadfortschritt will ich in einem wxListCtrl anzeigen. Und hier ist auch schon das Problem: Wie aktualisiere ich das wxListCtrl angemessen?

    Ich bräuchte eine Klasse Download, die den Download einer Datei ausführt. Das ganze muss natürlich in einem Thread ablaufen, damit der Hauptthread nicht blockiert wird. Anschließend müsste die Klasse Download dem wxListCtrl über den Downloadstatus bescheid geben. Dieses müsste dann den entsprechenden Eintrag auf den neusten Stand bringen. Das haut aber alles nicht so gut hin, weil ja mehrere Downloads zur gleichen Zeit laufen können. Ich kann der Klasse Download also nicht sagen, dass es immer die Zeile x aktualisieren soll.

    Wie würdet ihr dieses Problem lösen? Spontan fällt mir nur folgende Lösung ein: Nach jeder Aktualisierung werden alle Einträge aus dem wxListCtrl gelöscht und anschließend wieder mit den veränderten Werten hinzugefügt. Ich stelle mir das aber sehr langsam und daher irgendwie unschön vor...

    Ich bin ratlos, wie nie zuvor.



  • Hilft dir das Observer-Pattern da nicht?

    MfG SideWinder



  • Die paar Zeilen zu aktualisieren sollte wirklich kein Drama sein.



  • Zeus schrieb:

    Die paar Zeilen zu aktualisieren sollte wirklich kein Drama sein.

    Wenn es mir so einfach fallen würde, dann hätte ich nicht gefragt.



  • Sind das erstmal nur Gedankengänge oder gibst schon etwas Handfestes?



  • Zeus schrieb:

    Sind das erstmal nur Gedankengänge oder gibst schon etwas Handfestes?

    Es gibt noch nichts festes, da ich eben die Probleme sehe, die ich im Anfangspost nannte. Ich weiß nicht, wie ich den Eintrag im wxListCtrl mit dem Downloadstatus synchronisieren soll. Es sieht ja nun so aus:

    File | Filesize | Status | Time
    bla0.zip | 11 | Running | 00:00:03
    bla.zip | 1321 | Running | 00:03:01
    bla2.zip | 121 | Running | 00:00:05
    

    Wenn der erste Download fertig ist, dann rutschen alle folgenden Downloads nach unten. Ich kann also keine solche Klasse für den Download haben:

    class Download
    {
     private:
      downloadLib theLib;
      int theItemIndex;
    };
    

    Denn der Index wäre nicht mehr gültig. Es ist kein Problem, dass die Download-Klasse ein Event an das Hauptfenster sendet, aber wie soll es dann weitergehen? Ich muss irgendwie herausfinden, welche Zeile dann zu ändern/entfernen ist. Da liegt mein Problem.



  • Es gibt keine einzig richtige Patentlösung

    Aber du solltest dich mal über MVC schlau machen. Das würde in dem Fall recht gut passen.
    Du hast eine einzelne Klasse die die Verwaltung aller Downloads übernimmt. So kann sich die Download-Klasse ums herunterladen und die Liste um die Darstellung kümmern



  • Dokumentation lesen? http://docs.wxwidgets.org/stable/wx_wxlistctrl.html#wxlistctrlfinditem

    @zwutz
    Naja MVC ist meisten durch die UI-Lib vorgegeben, aber wenn ich hier so die Doku anschaue ist MVC abwesend.

    In Java hätte ich gesagt, setzt einfach das Modell neu mit deine Daten, die du von Downloader zu verfügung stellt.

    In WCF ist es noch einfach dank Data Binding.



  • Dann aber über den data-Eintrag (und nicht über den Namen), die ID des Downloads z.B..



  • Zeus schrieb:

    @zwutz
    Naja MVC ist meisten durch die UI-Lib vorgegeben, aber wenn ich hier so die Doku anschaue ist MVC abwesend.

    tses, und sowas nennt sich Framework... Glump 🤡

    Es sollte aber kein Problem sein, die dazu nötigen Patterns selbst umzusetzen. Nur etwas mehr Aufwand.


Anmelden zum Antworten