Autor Beitrag
JungerIslaender
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: 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 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 21.09.09 20:12 
OK Wie genau mache ich das?

Über nen Timer hatte ich mir das so gedacht:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Mo 21.09.09 20:38 
wie groß ist denn der Bereich deiner For-Schleife? :-o

ansonsten wie gesagt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  for i := 1 to endzahl do
  begin
    doSth;
    Application.ProcessMessages;
  end;
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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?

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
ThunderDragon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Windows 7 Professional 32Bit
Delphi 2009 Enterprise
BeitragVerfasst: Di 22.09.09 10:03 
Hallo,

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

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


mfg
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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