C# GUI Programm in Threads aufteilen.



  • Hi,
    Ich habe gerade mein erstes GUI Programm in C# (.NET) geschrieben.

    Es ist sehr simpel:
    Per Drag&Drop schiebe ich ihm ein paar URIs unter und per Buttons werden die verschiedenen verarbeitet.
    Das klappt auch ganz gut, einzig wenn ich die Daten (die auch umfangreicher sein können) verarbeiten lasse, reagiert die GUI nicht mehr.
    Im Prinzip/Moment kein Problem, man muss nur wissen, dass die Verarbeitung läuft und man mit weiteren Eingaben warten muss biss diese Verarbeitung abgeschlossen ist.

    Allerdings würde ich dieses Verhalten doch gerne beheben und mir ist auch klar, dass ich das durch auftrennen in mehrere Threads machen muss.
    Ich habe jetzt schon paar Sachen dazu gelesen – also wie man so Threads startet, aber noch nicht so richtig,
    wie man jetzt für GUI und Co die Architektur aufbaut, dass das richtig einfach & Problemlos zusammen arbeitet (mit Daten Weitergabe zw GUI und darunterliegenden Arbeits-Threads).

    Wollte daher wissen ob wer dafür geeignete Tutorials mit Beispiel kennt (die er auch selbst! Empfehlen kann),
    die nicht nur hin geklekst wirken aber nicht gleich versuchen ein Buch zu ersetzen.



  • Frage: Warum willst du das mit threads machen? Vielleicht wäre ein Fortschrittsbalken während des Lesens einer Datei sinnvoller. Der Anwender sieht, dass etwas passiert und ist zufrieden. Du selbst sparst auch das Nachdenken über Massnahmen zur Synchronisation.



  • berniebutt schrieb:

    Frage: Warum willst du das mit threads machen? Vielleicht wäre ein Fortschrittsbalken während des Lesens einer Datei sinnvoller. Der Anwender sieht, dass etwas passiert und ist zufrieden. Du selbst sparst auch das Nachdenken über Massnahmen zur Synchronisation.

    Weil man das doch eher so macht ... außerdem kann man dann bereits weitere Daten füttern während im Hintergrund die alten verarbeitet werden.
    Ladebalken wirkt irgendwie nur wie ein Notnagel - würde das gerne besser lösen, und gegen was lernen hab ich ja nix. Daher ja auch die Frage.


  • Administrator



  • Dravere schrieb:

    Reicht dir dies?
    http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

    Grüssli

    Nee 🙂

    Ich würde gerne etwas mehr haben, was mehr auf die Architektur einer Anwendung eingeht.



  • @FK2
    Also viel schöner könnte das Beispiel auf der MSDN Seite eigentlich nicht sein.

    Wenn du an den Worker-Thread Parameter übergeben willst, dann musst du bloss den RunWorkerAsync Overload verwenden der ein object als Parameter nimmt.
    Das übergebene Objekt kannst du dir dann mit DoWorkEventArgs.Argument im "DoWork" Handler holen.

    Das ist genau die "Datenweitergabe", die so auch ganz problemlos funktioniert.

    Von ReportProgress gibt es ebenfalls einen Overload der neben dem int noch ein object nimmt (-> ProgressChangedEventArgs.UserState ).

    Das Ergebnis kannst du dann nach DoWorkEventArgs.Result reinstecken, und im "RunWorkerCompleted" Handler wieder aus RunWorkerCompletedEventArgs.Result auslesen.

    Super einfach zu verwenden.

    Ansonsten gibt's hier noch ein Beispiel:
    http://msdn.microsoft.com/en-us/library/hybbz6ke.aspx

    Wenn du mit dem ersten Link nichts anfangen kannst, ist aber zu befürchten dass du mit diesem auch nichts anfangen können wirst.

    Natürlich solltest du dich über Threading allgemein schlau lesen. Die Fehler die man in GUI Anwendungen machen kann sind allerdings die selben die man auch überall sonst machen kann. D.h. GUI-spezifische "worauf muss ich aufpassen" Liste gibt es nicht. Naja, OK, doch. Ist aber recht kurz: du darfst auf GUI Elemente immer nur aus dem GUI Thread zugreifen.



  • Aso, also ich denke natürlich schon,
    dass ich damit für mein momentanes Problem schon mit diesen "Basis-Features" auskommen werde/könnte.

    Dachte allerdings auch generell, was danach noch weiter gehen würde,
    wenn ich doch mehrfach (auch zwischen durch) zwischen den Threads kommunizieren will?

    Welche patterns/Architekuren gibt es da?
    Dachte da kennt vl jemand einen guten Guide/Tutorial, dass die Wichtigen zunächst grob erklärt, damit man weiß, worauf man sich stürzen muss



  • FK2 schrieb:

    Welche patterns/Architekuren gibt es da?
    Dachte da kennt vl jemand einen guten Guide/Tutorial, dass die Wichtigen zunächst grob erklärt, damit man weiß, worauf man sich stürzen muss

    Tutorials kann ich dir keine empfehlen, aber ein paar Stichwörter zum googeln kann ich dir schon liefern.

    Grundlagen:
    Mutex
    Condition-Variable
    Data-Race bzw. Race-Condition

    Kommunikation zwischen Threads:
    Queues, speziell Producer Consumer Queue



  • Schau Dir doch mal das neue .Net 4.5 Feature TASKS an

    http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx

    Ich glaube einfacher geht's nicht mehr 😉


Log in to reply