Thread erst vollständig ausführen



  • Hallo,

    ich habe einen Thread für eine kontinuierliche Bildaufnahme, die per Mausklick gestoppt werden soll. Dieser Vorgang befindet sich in einer Schleife, da z.B. 10 Bilder aufgenommen werden sollen. Es tritt der Effekt auf, dass sowohl der Code im Thread als auch der Code nach dem Threadaufruf parallel abgearbeitet werden. Ich möchte jedoch erst den Thread komplett ausgeführt haben bevor an der Stelle des Threadaufrufes der Code weiter abgearbeitet wird.

    Man könnte natürlich den Thread ganz weglassen, nur dann reagiert kein Button mehr, z.B. zum Stoppen, deswegen denke ich mal müsste es schon ein Thread sein, allerdings sollte darauf gewartet werden, bis er komplett ausgeführt wurde....gibt es da irgendwelche Möglichkeiten??

    Vielen Dank und viele Grüße
    Cain



  • ManualResetEvent und AutoResetEvent.
    Oder Du kannst die Interlocked::xxx Methoden benützen um dir den Status zu übermitteln.
    Oder Du kannst dich via Callback vom Thread her informieren lassen, wenn die entsprechende Arbeit erledigt ist. Sehr schön zu nutzen wäre der BackgroundWorker.
    Grüsse Simon



  • Naja, bei sowas ist die einfachste Möglichkeit einfach nen Join.
    also:

    Thread t = xxx;
    t.Start();
    t.Join();
    weitererCode();
    

    So wird der weitere Code erst ausgeführt nachdem der Thread sich beendet hat.



  • Hi DeckCain,

    ich habe mich in letzter Zeit viel mit Thread auseinander gesetzt.

    Aber für solche Fälle wie unsere (meiner auch), haben sich die Leute von Microsoft schon auseinander gesetzt.
    Die wollten uns das mit dem Backgroundworker einfacher machen.
    Der Backgroundworker ist nichts anderes, als das der Code in einzelnen Threads ausgeführt wird.
    Mein Chef hat mir auf die Finger gehauen, als ich meine eigenen Threads basteln wollte.
    Setzt Dich mal mit dem Backgroundworker auseinander.

    Findest Du in der Toolbox unter Komponenten.

    Noch eine kleiner Link zu C# Openbook…

    http://www.galileocomputing.de/openbook/visual_csharp/visual_csharp_19_015.htm#Xxx999339

    Gruß, Doug_HH

    *Edit*
    War ein bisschen zu spät, schließe mich aber simon.gysi an.



  • Talla schrieb:

    Naja, bei sowas ist die einfachste Möglichkeit einfach nen Join.
    also:

    Thread t = xxx;
    t.Start();
    t.Join();
    weitererCode();
    

    So wird der weitere Code erst ausgeführt nachdem der Thread sich beendet hat.

    Das stimmt natürlich, jedoch blockiert der aufrufende Thread (bei dem konkreten Fall der UI Thread) und das wäre doch genau nicht das gewünschte Verhalten (UI soll reagieren).
    Oder hab ich da was falsch verstanden?

    Gruss Simon



  • Ja, dann kann man sich den Thread sparen...



  • Danke für die Ratschläge, habe mal den BackgroundWorker eingebaut,jedoch wird auch hier nach Aufruf des Background-Threads der Hauptthread parallel weiter ausgeführt....



  • Das ist ja auch der Sinn eines weiteren Threads!

    Was auch immer direkt nach dem Thread passieren soll:

    Lager es in eine eigene Methode auf und rufe die über ein Event des Backgroundworkers auf.



  • aber es muss doch Möglichkeiten geben, das im Hauptthread erst auf eine bestimmte Funktion gewartet wird, aber gleichzeitig das UI noch benutzbar ist. Wenn ich Threads komplett weglassen würde, hätte ich nähmlich das Problem, das keine Buttons mehr reagieren. Also muss ich ja einen Thread benutzen, nur der sollte halt erst mal komplett abgearbeitet werden, bevor es im Hauptthread weitergeht.



  • Ja mai... Dir wurden doch alle Informationen gegeben die Du benötigst. Wo ist denn da noch das Problem ?

    Warten bedeutet immer den Thread anhalten. Wenn Du den Thread anhälst, verarbeitet dieser nichts mehr.
    Du kannst doch aber das Event des Backgroundworkers nutzen. Starte Deine Aufgabe und mach danach einfach nix mehr und führe die folge Arbeiten durch das Event des Backgroundworkers aus.

    Das ist einfach Fakt. Wenn es da Probleme beim verstehen gibt raus damit, wenn Du das einfach nur nicht machen willst, dann such halt weiter.



  • Gerade ist der Groschen gefallen, was die Vorgehensweise von Threads angeht.Hab jetzt die komplette Funktion die sich um die Bildaufnahme samt Weiterverarbeitung kümmert in einen Backgroundworker gepackt und nun wartet das Programm brav darauf, das man per Maus bestätigt und gleichzeitig ist das UI verwendbar.

    Meine erste Überlegung war erst den Backgroundworker in die Schleife mit rein zu packen aber das geht nicht, da die Schleife dann weiter vom Hauptthread abgearbeitet wird. Wenn man die gesamte Schleife mit in den Backgroundworker packt klappt es, da dann nix mehr im Hauptthread abzuarbeiten ist und der 2.Thread auf die Eingabe wartet.

    Vielen Dank noch mal 🙂 , Gruß
    Cain


Anmelden zum Antworten