![]() |
Schleife duch Button anhalten und stoppen
Also folgendes Problem ich hab 2 For do schleifen ineinander
Delphi-Quellcode:
So sieht der Quelltext aus
If Fehler <> true Then
begin For x := min_x to max_x do begin For y := min_y to max_y do begin If x < y Then begin z1 := x*x + y*y; z := sqrt (z1); if round(z)=z then begin Ausgabe := ( inttostr (x) + '; ' +inttostr (y) + '; ' + FloattoStr (z)); Memo.Lines.Add (Ausgabe); Liste.Add(Ausgabe); Counter := Counter + 1; end; end; end; end; Memo.Lines.Add(inttostr (counter) + ' Zahlentrippel'); counter := 0; end; x und y können in dem prog schon mal 1.000.000 werden (wie es der benutzer halt will) solange das Programm die schleife berechnet kann ich nix anderes mit dem Programm machen deswegen meine Frage Wie kann ich während die Schleife läuft in dem Programm auf nen button drücken und wie kann der die Schleife anhalten und stoppen Ich hoffe es ist klar was ich meine wenn nicht posten und ich erklärs Axxus |
Re: Schleife duch Button anhalten und stoppen
Hallo,
damit dein Programm das Ereignis OnClick() des Stop-Buttons verarbeiten kann, musst du aus deinen verschachtelten Schleifen heraus gelegentlich Application.ProcessMessages aufrufen. Du kannst dann in deinem OnClick-Handler eine globale Variable CanceledByUser auf True setzen und diese Variable innerhalb deiner Schleife abfragen um ein Exit bzw. Break auszuführen. Oder du arbeitest gleich mit einem eigenen thread für die Berechnung. Grüße vom marabu |
Re: Schleife duch Button anhalten und stoppen
Damit die Anwendung weiter reagiert gibt es zwei verschiedene Möglichkeiten:
1.) Du lagerst alles in einen Thread aus oder 2.) Du gibst der Anwendung Zeit auf Ereignisse zu reagieren. In der Codebibliothek findet sich da 100%ig etwas. Das mit dem Stoppen/pausieren: 1.) Stoppe/Starte den Thread oder 2.) Bau auf while..do oder repeat..until Schleifen um und prüf mit einer globalen Variable ob die Schleife durchlaufen werden soll oder nicht. Threads machen zwar auf den ersten Blick mehr Arbeit, aber es könnt sich lohnen, das mal anzusehn EDIT: Roter Kasten... marabu war schneller ;) |
Re: Schleife duch Button anhalten und stoppen
Marbu's Variante benutze ich auch immer und sie reicht vollkommen. Einen Thread für den Vorgang zu proggen sollte nicht daran entschieden werden ob die Bearbeitung zwischendurch abgebrochen wird. Für einen eigenen Thread entscheidet man sich aus anderen Gründen. Das ist so bei dir sicher nicht nötig.
Das Exit würde ich hier einfügen:
Delphi-Quellcode:
Die Variable FUserBreak wird wie Marabu beschrieben hat im ButtonClick-Ereignis gesetzt auf welches die Anwendung nach Application.ProcessMessages hinreichend reagieren kann.
If Fehler <> true Then
begin For x := min_x to max_x do begin For y := min_y to max_y do begin Application.ProcessMessages; IF FUserBreak then Exit; .... Gruß oki |
Re: Schleife duch Button anhalten und stoppen
...wobei man sich evtl noch einen Zähler hernimmt und nur alle z.b.: 1000 (innere) Schleifendurchgänge das ProcessMessages ruft, da dieses doch arg an der Performance nagt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz