Abbruch Button Programmieren

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Tukuan.

    Abbruch Button Programmieren

    Hallo VB Freunde

    Habe eine FOR – NEXT schleife die langer Läuft

    Problem: Wie kann Ich ein Abbruch Button Programmieren?



    If Abbruch Butten then exit for

    Danke für die Hilfe
    Danke für die Antwort EiPott

    Nur leider wird das Click-Event des Buttons nach der For next ausgelöst und dann ist es zu spät!

    Danke für die Antwort dravus

    Das hört sich gut an!!

    Ob ich den Code zusammen bekomme? FG
    Hallo Sams,

    die Antwort von Eipott ist quatsch.
    Aber das hast du ja schon bemerkt.

    Eine lange Schleife sollte in einen eigenen Thread.
    Anfänger verwenden auch gerne ein Applikation.DoEvents innerhalb der Schleife.

    Das mit dem Thread gefällt aber besser.

    Gruss

    mikeb69
    Der BackgroundWorker ist dafür perfekt gemacht. Er besitzt eine Abbruch-Funktion. Zusätzlich hat er eine Progress-Funktion.

    msdn.microsoft.com/en-us/libra…dworker%28v=VS.80%29.aspx
    Von meinem iPhone gesendet

    Zeitliche Unterschiede

    Moin Forum,

    hab gerade gelesen, wie man es richtig macht ;)
    Bevor ich aber nun mein Projekt auf Backgroundworker umstelle (das Prinzip finde ich klasse) 'ne kleine Frage:
    Gibt es einen Zeitlichen Unterschied, wenn man Backgroundworker verwendet?
    Dauert die Berechnung mit dem Backgroundworker langsamer?

    Im Projekt gibt es eine sehr rechenintensive Berechnung die diverse Dateien berechnet. Eine Datei dauert schon ca. 2 min und es kommen gerne einige 100 Dateien zusammen.
    Sprich: die Berechnung dauert lange.
    Daher auch der Abbrechknopf mit der Möglichkeit die Berechnung zu stoppen.
    Ich möchte nun ungern Umstellen, um dann festzustellen, das ne Berechnung nun 3 min dauert...

    Vielen Dank im Voraus
    Tukuan
    Der Backgroundworker arbeitet die Prozedure genau so schnell ab als hättest du keinen.
    Vorteile daraus sind wie die oben bereits genannten.

    Zum Verständnis:
    Dein Programm wird in einem Thread ausgeführt. Das ganze logischerweise Stück für Stück (Codezeilen)
    Der Backgroundworker hat aber einen eigenen Thread. Somit wird dein Hauptthread (Programm) normal weiterlaufen und der Backgroundworker parallel dazu seine Arbeit verrichten.

    Rein logisch gesehen denke ich müsste das ganze sogar ein bisschen schneller laufen, da der Thread vom BGW nur diese eine Aufgabe besitzt.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    Try Catch im Backgroundworker? Automatische Verteilung auf mehrere Prozessorkerne

    Moin moin

    ich noch mal.

    Funktioniert der Try-Catch-Block im Backgroundworker?

    Und wir die Rechenleistung des Thread automatisch auf mehrere Prozessorkerne aufgeteilt? Oder muss man da noch andere Sachen machen/einrichten?
    Und wenn ich 2 Backgroundworker erstelle, wird es dann auf mehrere Kerne aufgeteilt?

    Gruß
    Tukuan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tukuan“ () aus folgendem Grund: Weitere Frage

    Try-Catch funktioniert überall dort, wo Exceptions geschmissen werden.
    Ein Backgroundworker = 1 Thread => 1 Prozessor.
    Willst Du mehrere Prozessoren / Cores benutzen, musst Du mehrere Threads / Backgroundworker implementieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Backgoundworker im Backgoundworker

    OK. Hört sich gut an.
    Aber mir stellen sich weitere Fragen... Sorry, bin alsoluter Neuling auf dem Thread Thema.
    Kann ich denn in einem Backgroundworker 2 weitere Backgroundworker anschmeißen?
    Und wie kann ich Backgroundworker Daten übergeben?

    Die Funktion arbeteite zur Zeit wir folgt im QuasiCode:

    Quellcode

    1. For each File in Folder
    2. read file
    3. data preparation
    4. do calculation_1 (Datensatz_a)
    5. do calculation_2 (Datensatz_a)
    6. safe data to one file
    7. Next


    Kann ich die ganze Funktion in einen Backgroundworker (BGW) packen und dann beiden Berechnungen in weitere BGWs packen?
    Problem ist, dass die Ergebnisse aus beiden Berechnungen zusammen wieder in eine Ergebnisdatei gespeichert werden müssen. Der Haupt-BGW müsste also auf die beiden Unter-BGWs warten. Geht das? Kann mir eventuell jemand mit Code aushelfen?

    Gruß
    Tukuan
    Dem Backgroundworker kannst Du globale Variablen geben oder er holt sich Daten über Properties. Du kannst praktisch beliebig viele Backgroundworker parallel arbeiten lassen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du kannst Prozedur schreiben. Bei Button Click rufst die Prozedur auf und verläst die schleife.

    VB.NET-Quellcode

    1. Private Sub Schleife (ByVal ButtonClick As Boolean)
    2. Dim z As Integer
    3. For Z = 0 to 100
    4. 'deine Code
    5. '....
    6. '.....
    7. If buttonClick = True Then
    8. Exit Next
    9. Next
    10. End Sub
    11. Private Sub Button_Click(....)
    12. Schleife(True) 'Schleife wird verlassen / Schleifen durchlauf wird abgebrochen
    13. 'Du muß den Argument irgend-wo wieder auf "False" setzen.
    14. End Sub

    Tukuan schrieb:

    Problem ist, dass die Ergebnisse aus beiden Berechnungen zusammen wieder in eine Ergebnisdatei gespeichert werden müssen. Der Haupt-BGW müsste also auf die beiden Unter-BGWs warten. Geht das? Kann mir eventuell jemand mit Code aushelfen?

    Das nennt man Fork-Join-Threading.
    guggemal Multi-Tutorial
    In deinem Fall wird Fork-Join-Threading nur soviel nützen, dass alle Cpu-Kerne mithelfen können.
    Eine weitere Aufteilung würde jedem Thread nur einen umso kleineren Anteil der Cpu-Power zuteilen, sodaß sich kein performance-Vorteil ergibt.

    Der BW ist eiglich ziemlich schrott, weil ers nicht unterstützt, typisierte Argumente in den NebenThread zu schleusen, und zurück.
    Gugge AsyncWorker - CodeProject

    SystemUnknow schrieb:


    Du kannst Prozedur schreiben. Bei Button Click rufst die Prozedur auf und verläst die schleife.

    VB.NET-Quellcode

    1. Private Sub Schleife (ByVal ButtonClick As Boolean)
    2. Dim z As Integer
    3. For Z = 0 to 100
    4. 'deine Code
    5. '....
    6. '.....
    7. If buttonClick = True Then
    8. Exit Next
    9. Next
    10. End Sub
    11. Private Sub Button_Click(....)
    12. Schleife(True) 'Schleife wird verlassen / Schleifen durchlauf wird abgebrochen
    13. 'Du muß den Argument irgend-wo wieder auf "False" setzen.
    14. End Sub

    so ein schwachsinn! als ob man in einen laufenden sub eingreifen könnte und ihm parameter übergeben könnte! wenn man es wie dein beispiel macht (außerdem hast du application.doevents vergessen) dann wird eben wenn der button gedrückt wurde noch mal die sub aufgerufen welche gleich wieder beendet wird, und dann geht die vorherige sub wieder weiter! fail ...
    außerdem sind sie schon längst zu der einsicht gelangt, das mit bgw/threads zu realisieren!