Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - For-Schleife nach Button-Klick abbrechen


JungerIslaender - Mo 21.09.09 19:36
Titel: For-Schleife nach Button-Klick abbrechen
Hey, wenn ich jetzt ne einfache for schleife habe, dann läuft die ja bis die Abbrech bedingung erfüllt ist. Währenddessen kann man ja in der form nichts anklicken oder machen.

Wie funktioniert das das ich wenn ich z.B. auf einen Button drücke die Schleife abbricht.

Das einzige was mir einfällt it, das Ganze über einen Timer zu realisieren.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 21.09.2009 um 22:39
Moderiert von user profile iconNarses: Titel geändert.


Sinspin - Mo 21.09.09 20:07

Ein Timer bringt dir da erstmal auch nichts. Der feuert einfach nicht solange die Schleife läuft. Es sei denn du unterbrichst sie in regelmäßigen Abständen um der Nachrichtenverarbeitung deiner Anwendung die Möglichkeit zu geben auf Signale des Systems zu reagieren, wo der Timer dazugehört.
Diese Unterbrechungen bekommt man durch einen Aufruf von Application.ProcessMessages hin. Allerdings ist der Timer dann auch überflüssig, denn dann wird auch ein Button OnClick ausgelöst falls er mal angeclickt wurde. In dem kannst du dann ein Flag setzen das du in der Schleife überprüfst um diese zu beenden oder sonst was anderes damit zu machen.


JungerIslaender - Mo 21.09.09 20:12

OK Wie genau mache ich das?

Über nen Timer hatte ich mir das so gedacht:

Delphi-Quelltext
1:
2:
3:
4:
Timer1.ontime
begin
if prozedur_durchführen=true then PROZESS
end;

Timer intervall = 10

Dann kann ich einfach prozedur_durchführen:= false; setzen. Das kam mir einfach nur unprofessionel vor.


FinnO - Mo 21.09.09 20:38

wie groß ist denn der Bereich deiner For-Schleife? :-o

ansonsten wie gesagt:


Delphi-Quelltext
1:
2:
3:
4:
5:
  for i := 1 to endzahl do
  begin
    doSth;
    Application.ProcessMessages;
  end;


JungerIslaender - Mo 21.09.09 21:03

Das ist noch alles hypothetisch im Rahmen dessen:

http://www.delphi-forum.de/viewtopic.php?p=578861#578861


Delete - Mo 21.09.09 21:25

Du machst dir schon Gedanken über detaillierte Programmzeilen ohne überhaupt eine Idee zu haben, wie das ganze überhaupt funktionieren soll? Ich glaube, Architekten fangen auch nicht den Tischdecken im Gästezimmer an. ;)


Tastaro - Di 22.09.09 08:28

Nebenbei:
Wenn man ein Schleife mit mehreren Abbruchkriterien benötigt, dann sollte man auch eine solche verwenden.
Also while oder repeat-until statt for.

Beste Grüße


Lossy eX - Di 22.09.09 09:07

Vom Prinzip her kann ich Luckie nur voll zustimmen. Man entwickelt Problemlösungen für Probleme. Entsprechend sollte man auch ein konkretes Problem haben. Nur dann kann man eigentlich sinnvoll eine Lösung dafür finden.

Und zu den Vorschläge. Das "Problem" an einer Schleife ist, dass wärend dessen die VCL keine Windowsbotschaften verarbeiten kann. Entsprechend bleibt die Anwendung, zu mindest rein optisch, komplett stehen. Das betrifft alle Schleifen. For, While oder Repeat spielt dabei überhaupt keine Rolle. So etwas durch dauernde Aufrufe von Application.ProcessMessages zu "lösen" würde zu mindest auf den ersten Blick eine Lösung sein. Aber dadurch kann man seinen eigenen Code auch empfindlich stören bzw ist das ganze nur eine Pseudolösung, die versteckte Probleme birgt.

Wenn du einen große Schleife hast (die einige oder mehrere Sekunden rechnen muss), dann ist das einzig Sinnvolle diese in einen Thread auszulagern. Das erfordert natürlich mitunter deutlich mehr Aufwand und ist nicht mehr ganz so einfach wie eine normale Schleife. Dafür bleibt deine Anwendung aber dauerhaft am Leben. Und zwar ohne irgendwelche Tricks einsetzen zu müssen.

Deine Anwendung würde diese Berechnung dann anstoßen und auf dessen Beendigung warten. In der zwischenzeit sollte die Anwendung eventuelle Schalftflächen, Menüs sperren damit das nicht noch mal aufgerufen werden kann. Wird dann der Abbrechen Knopf gedrückt, dann sendet deine Anwendung ein mach mal fertisch an den Thread. Dieser muss darauf reagieren und kann zu einem kontrollierten Punkt mit der Berechnung aufhören. Fall das deiner Anwendung zu lange dauern würde könnte sie den Thread auch hart abschießen. Aber das sollte bei sauberer Programmierung eher nicht nötig sein.


thepaine91 - Di 22.09.09 09:26

Und zum Timer mal der schafft Real keine 10 ms sondern ~55 ms
Ich würde es ebenfalls in einen Thread auslagern.


Lossy eX - Di 22.09.09 09:53

user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Und zum Timer mal der schafft Real keine 10 ms sondern ~55 ms

Wie kommst du denn da drauf?


Narses - Di 22.09.09 10:01

Moin!

Die Timer-Problematik diskutieren wir aber bitte in einem eigenen Thread, OK? Danke. ;)

Angebot: Soll ich die beiden Postings in einen eigenen Thread abtrennen? :nixweiss:

cu
Narses


ThunderDragon - Di 22.09.09 10:03

Hallo,

so könntest du die Schleife durch drücken der ESC - Taste abbrechen:


Delphi-Quelltext
1:
if GetAsyncKeyState(VK_ESCAPE) <> 0 then exit;                    


mfg


Lossy eX - Di 22.09.09 10:10

@Narses: Jain. So ganz Offtopic ist es eigentlich auch nicht. ;) Denn eigentlich ein Timer mit 1 ms wurde bei mir bisher auch immer mit ca. 1 ms aufgerufen. Und damit kann man indirekt eventbasierte Schleifen erstellen. Kann manchmal auch ganz nützlich sein. Auch wenn man andere Wege vorziehen sollte.


Narses - Di 22.09.09 10:13

Moin!

user profile iconLossy eX hat folgendes geschrieben Zum zitierten Posting springen:
@Narses: Jain. So ganz Offtopic ist es eigentlich auch nicht. ;)
[...]
Und damit kann man indirekt eventbasierte Schleifen erstellen.
Ja, bis hierhin ist das noch OnT, aber wie schnell ein Timer ist und warum, diskutieren wir dann aber bitte wirklich nicht hier. :)

cu
Narses


thepaine91 - Di 22.09.09 11:00

Dazu wird es nicht kommen. Es ist nur wichtig um klar zu machen das man mit einem (standart)Timer eine Menge Zeit verliert wenn man darüber eine Schleife realisieren will.

NT/XP/2000 = ca.10
95/98 = 55
Die 55 hatte ich richtig in Erinnerung wie oben beschrieben allerdings nur bei 95,98.
http://blubplayer.de/tutorials/TimerTutorial.pdf
Dort wird gleichzeitig noch Informiert welche Alternativen es gibt. Habe auch einen Link zu Luckies Homepage gesehen.
So damit ist das Thema auch beendet denke ich.

Und jetzt ist erst mal die Reaktion des Threaderstellers gefragt.

mfg nic