Entwickler-Ecke
Sonstiges (Delphi) - Schleife hängt sich auf
MKehrer - Di 23.09.03 08:58
Titel: Schleife hängt sich auf
Hi Delphianer,
ich starte mit Button1 eine Schleife die ich mit Button2 wieder beende.
folgendes funktioniert:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Var running,stoprequest:Boolean;
procedure TForm1.Button1Click(Sender: TObject); begin If running then Exit; running:=true; stoprequest:=False;
repeat Application.processmessages; until stoprequest;
running:=false; stoprequest:=false; beep; end;
procedure TForm1.Button2Click(Sender: TObject); begin stoprequest:=true; end; |
wenn ich aber button2Click folgendermaßen codiere, wird bei keiner Schleife ein Ende gefunden
Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button2Click(Sender: TObject); begin stoprequest:=true; repeat application.processmessages Until not running; end; |
Weiß jemand, warum?
Oder weiß jemand eine andere Lösung, damit am Ende von Button2Click die Schleife in Button1Click sicher beendet ist?
AndyB - Di 23.09.03 09:45
Setzt du irgendwo in deinem Code nochmal stoprequest:=false; ? Z.B. in einem Timer, oder anderem Thread?
Was du auch noch ausprobieren kannst ist die Code-Optimierung einmal auszuschalten. Ich weiß im Moment nicht, ob der Compiler die globale Variable vielleicht in ein Register auslagert. Sollte das der Fall sein, kannst du das umgehen, indem du stoprequest über eine Funktion abfrägst:
Delphi-Quelltext
1: 2: 3: 4:
| function GetStopRequest: Boolean; begin Result := stoprequest; end; |
CenBells - Di 23.09.03 09:53
HAllo,
@MKehrer: was du versuchst, ist mehrere Threads zu simulieren. Da kommst du aber so nicht weiter. Dein gedanke, "ein application.processmessages lässt nun die andere prozedur ausführen" ist leider nicht richtig. Du hängst immer noch in deiner schleife von button 2 fest. Die variable stoprequest wird nicht mittels einer windows botschaft verändert, also kann die schleife nicht beendet werden (die, in button2 onclick)
Deine erste variante ist in diesem Fall die einzige funktionierende (ohne threads oder definieren von messages, die anzeigen, daß die variable geändert wurde). Du rufst die schleife auf, und wartest so lange, bis stoprequest true ist. Dazu überprüfst du in jedem Schleifendurchlauf mittels Application.processmessages, ob andere Nachrichten eingetroffen sind und verarbeitest diese. Ein Button.OnClick ist so ein ereignis, was durch eine Nachricht ausgelöst wird. ....
Ich hoffe, ich konnte es halbwegs verständlich erklären.
Gruß
Ken
MKehrer - Di 23.09.03 10:10
@Ken
Dank Dir, ist ja eigentlich klar.
Ich hab´s jetzt mit SendMessage gelöst.
Leider bin ich dann plattformabhängig.
PS: wie schaut´s mit Kuelschrank.FillupWithBeerBottles aus ? :wink:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!