none
Benutzerdefinierter Schleifenabbruch RRS feed

  • Frage

  • Hallo... ,

    ich möchte z.B. eine 'For Each' Schleife z.B. :

    For Each _ur as DataRow in DTANZ.Rows

    ...Verarbeitung...

    Next

    von außen durch eine Benutzeraktion, z.B. durch Drücken eines Buttons, abbrechen.

    Gibt's da eine einfache Möglichkeit?

    Vielen Dank und Tschüß

    Püsch

    Mittwoch, 29. August 2012 15:11

Antworten

  • Hallo, also erstmal müsstest du die Schleife in einen 2. Thread packen. Anschließend in jeder Iteration einen boolschen Wert abfragen, ob abgebrochen werden soll. Wenn er true ist, so brichst du die Schleife (Ich glaube mit For Exit) ab. Wenn false machst du weiter. Diese Variable könnte dann der Benutzer durch einen Buttonklick ändern. Du müsstest aber eventuel über einen Dispatcher arbeiten.

    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 29. August 2012 15:21
    Moderator
  • Hallo Püsch,

    DoEvents war und ist immer eine Krücke gewesen.

    Heutzutage, wo so ziemlich jeder Rechner mehrere Kerne hat, die auf Arbeit warten,
    ist ein zweiter Thread immer die bessere Lösung. 

    Die genannte Aufgabe passt sehr gut in in einem BackgroundWorker und ist mit einer Handvoll Zeilen Code umgestellt.  Als Bonus kannst Du den Anwender über den Verarbeitungsfortschritt informieren. Und sollte das zu langweilig werden kann er im Programm weiter werkeln.

    Gruß Elmar

    Freitag, 31. August 2012 13:39
    Beantworter

Alle Antworten

  • Hi Püsch,

    erstell die ein Objekt, welches einfachen Boolen Property hat (z.B.) Stop und eine.

    Das Objekt erzeugst du in deinen UI-Thread und gibst es in den 2. Thread hinein.

    In der Schleife kannst du den Wert abprüfen.

    If objkt.Stop then
       exit for
    end if
    

    Wenn du jetzt im UI Thread den Wert für Stop = true setzt.

    Wird die Schleife beendet.

    MFG

    Björn

    Mittwoch, 29. August 2012 15:18
  • Hi,

    einfach eine Variable auf Klassenebene setzen und auf diese in der Schleife prüfen.

    Class MeineKlasse
    
        Private ExitLoop As Boolean = False
    
        Private Sub MachWas()
    
            For Each x As y In z
    
                If ExitLoop Then
                    Exit For
                End if
    
                ...
    
            Next
    
            ExitLoop = False
    
        End Sub
    
        Private Sub Button_Click( ... ) Handles MeinButton.Click
            Me.ExitLoop = True
        End Sub
    
    End Class
    
    Ich hab das jetzt nur schnell so dahingeschrieben, es könnten also noch Fehlerchen enthalten sein, den Weg sollte es aber zeigen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 29. August 2012 15:19
    Moderator
  • Hallo, also erstmal müsstest du die Schleife in einen 2. Thread packen. Anschließend in jeder Iteration einen boolschen Wert abfragen, ob abgebrochen werden soll. Wenn er true ist, so brichst du die Schleife (Ich glaube mit For Exit) ab. Wenn false machst du weiter. Diese Variable könnte dann der Benutzer durch einen Buttonklick ändern. Du müsstest aber eventuel über einen Dispatcher arbeiten.

    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 29. August 2012 15:21
    Moderator
  • Vielen Dank für Eure Tips!

    Ein Bekannter hatte mir jetzt den Tip gegeben, es in der Schleife per:

    Application.DoEvents()

    zu machen. Geht auch ganz gut, oder können da Probleme entstehen?

    Gruß Püsch

    Donnerstag, 30. August 2012 11:42
  • Hi Püsch,

    die Lösung mit dem 2. Thread ist die Saubere.

    Siehe Is Doevents Evil?

    MFG

    Björn

    Donnerstag, 30. August 2012 11:55
  • DoEvents reicht in einigen Zwecken aus. Aber man sollte bedenken, dass zu dem Zeitpunkt des Auftrufs jede Art anderer Events behandelt werden können, die ihrerseits vielleicht noch Einfluss auf andere in deiner Schleife verwendete Variablen haben können. Ganz zu schweigen davon, dass vielleicht die Schleife, z.B. durch einen Menüeintrag, erneut gestartet wird. Das kann unschöne Effekte geben.

    Also wenn DoEvents, dann genau darauf achten, was der User während er "den Button drücken könnte", noch so an Unheil in deiner Form anrichten kann (andere Controls, deren Events du behandelst).

    Eine mögliche Abhilfe dafür wäre, während deiner abbrechbaren Schleife eine globale Variable setzen (z.B. "WorkingLoop = true") und in etwaigen Menüs und anderen Buttons und dgl. abfragen "If WorkingLoop Then Exit Sub", damit während deiner Schleife wirklich kein anderer Unfug passiert, außer dieser eine Button. Am Ende der Schleife (egal ob abgebrochen oder normal beendet) dann WorkingLoop wieder auf "False" setzen.

    LG, Dennis.


    Freitag, 31. August 2012 12:33
  • Hallo Püsch,

    DoEvents war und ist immer eine Krücke gewesen.

    Heutzutage, wo so ziemlich jeder Rechner mehrere Kerne hat, die auf Arbeit warten,
    ist ein zweiter Thread immer die bessere Lösung. 

    Die genannte Aufgabe passt sehr gut in in einem BackgroundWorker und ist mit einer Handvoll Zeilen Code umgestellt.  Als Bonus kannst Du den Anwender über den Verarbeitungsfortschritt informieren. Und sollte das zu langweilig werden kann er im Programm weiter werkeln.

    Gruß Elmar

    Freitag, 31. August 2012 13:39
    Beantworter
  • Hallo Püsch_Münster,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.

    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 26. September 2012 14:19
    Moderator
  • Hallo Robert,

    sorry, daß ich mich erst jetzt melde, aber ich habe verschiedene Möglichkeiten ausprobiert.

    Ist jetzt alles Gut!

    Danke nochmal und einen schönen Gruß aus Münster

    Michael

    Donnerstag, 27. September 2012 13:58
  • Hallo Michael,

    freut mich das alles gut ist.

    Welche Auswahl hast Du aus den Möglichkeiten getroffen?
    Das könnte auch andere interessieren.

    Gruß Elmar

    Donnerstag, 27. September 2012 16:27
    Beantworter
  • Hallo Robert,

    sorry, daß ich mich erst jetzt melde, aber ich habe verschiedene Möglichkeiten ausprobiert.

    Ist jetzt alles Gut!

    Danke nochmal und einen schönen Gruß aus Münster

    Michael


    Hallo Püsch_Münster,

    Es wäre schön und hilfreich, wenn Du posten würdest wie es funktioniert hat, denn dann profitieren unter Umständen andere mit dem gleichen Problem davon.

    Danke und Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 27. September 2012 16:46
    Moderator