Autor |
Beitrag |
JungerIslaender
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mo 21.09.09 19:36
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 Narses: Topic aus Sonstiges (Delphi) verschoben am Mo 21.09.2009 um 22:39
Moderiert von Narses: Titel geändert.
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: 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.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
JungerIslaender 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: 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
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mo 21.09.09 20:38
wie groß ist denn der Bereich deiner For-Schleife?
ansonsten wie gesagt:
Delphi-Quelltext 1: 2: 3: 4: 5:
| for i := 1 to endzahl do begin doSth; Application.ProcessMessages; end; |
|
|
JungerIslaender 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mo 21.09.09 21:03
Das ist noch alles hypothetisch im Rahmen dessen:
www.delphi-forum.de/....php?p=578861#578861
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 414
Erhaltene Danke: 23
|
Verfasst: 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
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: 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.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: 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
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Di 22.09.09 09:53
thepaine91 hat folgendes geschrieben : | Und zum Timer mal der schafft Real keine 10 ms sondern ~55 ms |
Wie kommst du denn da drauf?
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
ThunderDragon
      
Beiträge: 26
Windows 7 Professional 32Bit
Delphi 2009 Enterprise
|
Verfasst: 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
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: 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.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 22.09.09 10:13
Moin!
Lossy eX hat folgendes geschrieben : | @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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: 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.
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
|
|