![]() |
Abbrechen und auf Abbruch warten?
Hallo,
ich schaffe es nicht, eine Schleife extern abzubrechen und auf den erledigten Abbruch zu warten. Bisher habe ich das so gemacht (nur das Nötige): Formular mit zwei Schaltern. Der eine läßte die Schleife los, der andere hält sie an. Der Implementations-Teil:
Delphi-Quellcode:
{Wird ordentlich abgebrochen. Das "showmessage in Button1Click ist nur zum Gucken. Muss nicht sein!
var Abbruch: Boolean = False;
abgebrochen: Boolean = false; procedure TForm1.Button1Click(Sender: TObject); begin abbruch:=false; while true do begin application.processmessages; if Abbruch then begin abgebrochen:=true; break; end; end; If abbruch then begin showmessage(inttostr(integer(abgebrochen))+'Abbruch'); end; end; procedure TForm1.Button2Click(Sender: TObject); var i: LongInt; begin abgebrochen:=false; abbruch:=true; application.ProcessMessages; Nun will ich auf den Abbruch warten und das geht nicht. Abgebrochen bleibt false und es wird auch keine Meldung im ersten //Schalter generiert. Nehme ich diese Schleife weg, geht es ordentlich. Hintergrund: Ich benutze rekursive Funktionen und er soll erst weitermachen, wenn auch wirklich alles beendet wurde. Man kann übrigens nicht mal mit Systemmenü oder oben rechts das Programm beenden!!! Es sieht fast so aus, als wenn er Abbruch:=true erst an das restliche Programm sendet, wenn die zweite Ereignisprocedure verlassen wird! Aber das ist doch Quatsch, oder? Button2click geht so weiter:}
Delphi-Quellcode:
Wo mache ich meinen Denklfehler und wie geht es? Hat jemand einen Tipp?
while not abgebrochen do begin
label1.caption:=inttostr(i); inc(i); application.ProcessMessages; end; end; Gruß Matthias |
Re: Abbrechen und auf Abbruch warten?
Hmm.. also auf den ersten Blick kommt mir while true sehr komisch vor..
while variable=true ist glaube ich das was du eigentlich willst. Davon mal abgesehen mache ich das ohne Break mit
Delphi-Quellcode:
und in dem 2. Button setze ich dann abgebrochen auf TRUE.
abgebrochen:=FALSE;
repeat . . application.ProcessMessages; until abgebrochen; |
Re: Abbrechen und auf Abbruch warten?
Hallo Georg,
benötigst Du wirklich diese Unmenge von application.processmessages? Ich glaube beim 2. Button sind die überflüssig.
Delphi-Quellcode:
Aus diesem Grund gibt es keine Ausgabe, da abgebrochen in Button1 auf "true" gesetzt wird.
Button2:
abgebrochen:=false; abbruch:=true; application.ProcessMessages; Button1: if Abbruch then begin abgebrochen:=true; break; end; Button2: while not abgebrochen do begin label1.caption:=inttostr(i); inc(i); application.ProcessMessages; end; end; Viele Grüße Ines |
Re: Abbrechen und auf Abbruch warten?
Hallo,
vielen Dank für Eure schnellen Antworten. Bloß leider beantworten sie nicht meine Frage. Ich wollte eigentlich weniger über die Form der Quellen diskutieren (Ich glaube, ich habe geschrieben, dass es nur das Nötige ist!) als über das Prinzip des Abbruchs mit Warten. Statt "while true.. " kannst Du auch "While Apfel=true..." oder nur "while Apfel..." schreiben, wenn Apfel eine Variable ist und mit true vorbelegt wurde. Das application.processmessages brauche ich, um zu sichern, dass wirklich zu diesem Zeitpunkt alle Windows-Messages im Programm abgearbeitet werden. Sonst arbeitet er nämlich nicht mal Abbruch:=true ab, wenn er IN der Schleife sitzt! Aber wie mache ich denn nun den Abbruch mit Warten? Gruß Matthias |
Re: Abbrechen und auf Abbruch warten?
Zitat:
Unabhängig davon wie man es besser machen könnte... Ich würde sagen, das problem liegt nicht in den Codestellen, die Du "uns" gepostet hast. Frank :coder: |
Re: Abbrechen und auf Abbruch warten?
Hallo Frank,
entschuldige, aber ich dachte doch tatsächlich, dass zu einer schriftlichen Nachricht auch ein "Hallo" oder so gehört... Das, was ich Euch geschickt habe, ist gaaaanz genau das Problem. Wie geschrieben: Ein Formular mit zwei Schaltern (und einem Label, um zu sehen, ob abgebrochen irgendwann gesetzt wird - wird es nicht, wenn man es in der zweiten Schleife abfragt!) und die entsprechenden Ereignisprozeduren so, wie aufgeschrieben. Da das Original nicht wollte, habe ich es auf dieses einfache Programm reduzieret - und siehe da, die gleichen Fehler! Ich könnte mir aber auch vorstellen, dass es für "Abbruch und warten bis abgebrochen" ein fertiges Prinzip gibt. Es muss doch irgendwie zu machen sein... (Gut, man könnte die Schleife in einen Thread auslagern und nach dem Abbruch warten, bis der Thread beendet oder angehalten wurde. Das würde evtl. (?) funktionieren. Aber, muss man wirklich gleich mit Kanonen auf Spatzen schießen?) Gruß Matthias |
Re: Abbrechen und auf Abbruch warten?
HALLO!
Also in der 2. Schleife bleibt der Programm hängen, weil es keine MSG mehr zu behandeln gibt. Du bist zwar mit dem 1. Application.Processmessages aus der Button1. Schleife rausgesprungen, aber Du kommst nicht zurück, bis der Button2 event abgearbeitet ist. Nimm also die Schleife aus dem 2. Button event und schon geht es... Es gibt auch nix zu warten, den nach einem Klick, wird die 1. Schleife sofort beendet. Frank :coder: |
Re: Abbrechen und auf Abbruch warten?
Hallo Frank,
vielen Dank für Deine Antwort. Das ergibt Sinn, aber warum steht für die Schleife im Button2 keine MSG mehr bereit? Sprich: In Button1click wird mit abgebroche:=true eine MSG generiert. In Button2 ist er in der 2. Schleife und soll nun "schleifen", bis diese MSG generiert ist. Warum klappt das nicht? Wenn ich nach dem schnellen Abbruch abgebrochen in Button2 (ohne Schleife) überprüfe, dann wurde es gesetzt. In derf Schleife nimmt er aber nicht das Gesetzte, sondern bleibt bei dem ursprünglichen Wert false. Bei der ersten Schleife in Button1click nimmt er aber Abbruch:=true irgendwann mal an, was ja dann richtig zum Abbruch führt. Im Originalprogramm (und nicht nur in meinem!) geht es darum, dass in der 1. Schleife (Button1click) einige sehr rechenintensive Dinge erledigt werden. Prktisch kann ma sich das vorstellen, wie große Schleifen in der Schleife. Wenn ich nun das Abbruchkommando für die 1. Schleife geb, soll (und kann) er erst ordentlich weitermachen, wenn die wirklich (sauber) abgebrochen wurde. Das heißt, dass alle "Unterschleifen" der 1. Schleife ordentlich beendet wurden. Das kann eine Weile dauern. Also muss ich tatsächlich irgendwie auf die korrekte Beendigung (durch Abbruch) der 1. Schleife warten. Dazu wollte ich eben eine Variable bei Abbruch der 1. Schleife setzen, die ich dann in der 2. Schleife (Button2click) abwarte. Also: 1. Schleife breche ich mit Button2 ordentlich ab, indem ich Abbruch:=true setze. Dabei wird in dieser 1. Schleife eine Variable abgebrochen:=true gesetzt. In der 2. Schleife warte ich und frage diese Variable nur ab. Fragt sich, warum ich die 1. Schleife so abbrechen kann, aber es in der 2. Schleife ignoriert wird!? Ich sehe einfach nicht den inhaltlichen Unterschied zwischen dem Abbruch der 1. Schleife und dem Nichtabbruch der 2. Schleife. Entwerde dürfte er dann gar nicht in die 2. Schleife kommen, weil abgebrochen:=true von Anfang an gilt, oder er wertet das neue Setzen von abgebrochen:=trfue nicht aus. Aber warum nicht? Gruß Matthias |
Re: Abbrechen und auf Abbruch warten?
Zitat:
Zitat:
Das belegen einer Variable erzeugt doch keine MSG Zitat:
Zitat:
mfg Frank :coder: |
Re: Abbrechen und auf Abbruch warten?
Hallo Frank,
vielen Dank für die Antwort. Gab mir wieder einen Tipp, in welche Richtung ich weitersuchen könnte. Ich habe nun eine private Msg gebastelt und eine entsprechende Behandlungsroutine. In der wird nur abgebrochen:=true gesetzt. Bei Abbruch:=true wird in Schleife 1 diese Msg abgesetzt (mit sendmessage oder postmessage). Schleife 2 wird aber trotzdem nicht abgerochen. Der neue Wert von abgebrochen kommt einfach nicht an. (Auch mal getmessage und peekmessage probiert!) Ich weiß einfach nicht, was man da noch machen könnte... Das "riecht" mir schon fast nach einem Bug in Delphi. Aber ich bin schon immer eher der Meinung, dass da was von mir nicht richtig will. Trotzdem: Was tun? Ich bin mir ganz sicher, dass sowas geht bzw. gehen müsste. Viele Programme machen das! Wahrscheinlich und z. B. auch nero.(?) Wenn man da das Brennen abbricht, dauert das auch erst noch eine Weile, bis alles ordentlich beendet ist und man die Brennseite zu machen kann! Gruß Matthias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 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