Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schleife duch Button anhalten und stoppen (https://www.delphipraxis.net/80671-schleife-duch-button-anhalten-und-stoppen.html)

Axxus 13. Nov 2006 14:49


Schleife duch Button anhalten und stoppen
 
Also folgendes Problem ich hab 2 For do schleifen ineinander
Delphi-Quellcode:
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;
So sieht der Quelltext aus

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

marabu 13. Nov 2006 14:56

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

cruiser 13. Nov 2006 15:02

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 ;)

oki 13. Nov 2006 15:20

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:
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;
....
Die Variable FUserBreak wird wie Marabu beschrieben hat im ButtonClick-Ereignis gesetzt auf welches die Anwendung nach Application.ProcessMessages hinreichend reagieren kann.

Gruß oki

Sidorion 13. Nov 2006 15:52

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