Benutzer mit den meisten Antworten
Benutzerdefinierter Schleifenabbruch

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
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/
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 26. September 2012 14:18
-
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
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 26. September 2012 14:18
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
-
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 -
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/
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 26. September 2012 14:18
-
-
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.
- Bearbeitet Dennis Becker Freitag, 31. August 2012 12:37
-
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
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 26. September 2012 14:18
-
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.
- Als Antwort markiert Püsch_Münster Donnerstag, 27. September 2012 13:57
- Tag als Antwort aufgehoben Robert BreitenhoferModerator Donnerstag, 27. September 2012 14:08
-
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-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
- Bearbeitet Robert BreitenhoferModerator Donnerstag, 27. September 2012 16:46 Formatierung