Autor Beitrag
Matty92
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: So 02.05.10 20:02 
Hi,
ich sitze jetzt am nächsten Problem, und zwar, wie pausiere ich eine repeat-until schleife, führe anweisungen aus (Sachen ändern, weitere Fenster öffnen oder gar nichts tun) und lasse sie dann weiterlaufen?
Also z.B. ich drücke einen Knopf, pause:=true und das wird dann in der Schleife abgefragt, und falls es zutrifft soll sie pausieren, und wenn pause:=false durch erneutes drücken gesetzt wird, soll die Schleife ganz normal weiterlaufen.

Viele Grüße,
Matty
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 02.05.10 20:26 
Das Konzept hört sich sehr seltsam an. Teile lieber deine Schleife auf, Windows und Delphi sind eben ereignisbasiert. Das dann so zu verbiegen macht nur Probleme. ;-)

Eine Möglichkeit ist zum Beispiel eine eigene Klasse, in der der aktuelle Status gespeichert ist. Da kannst du dann immer weitermachen, wenn in der GUI irgendetwas passiert ist.

Genaueres lässt sich so allgemein schlecht sagen, aber die Schleife lässt sich auf jeden Fall auflösen und so das Problem besser lösen. Notlösung wäre tatsächlich mit Application.ProcessMessages und Schleifen zu warten, aber sinnvoll ist es jedenfalls nicht...
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 02.05.10 20:52 
nimm statt der Schleife lieber einen Timer sofern möglich.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 02.05.10 21:38 
Ein Timer ist zwar oft eine Lösung, aber hier bin ich da nicht so sicher. :gruebel:

Schließlich geht es ja nicht primär um eine Zeitverzögerung, oder habe ich da was falsch verstanden?
(Sondern darum Daten eingeben zu lassen oder Fenster anzuzeigen usw.)
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 02.05.10 21:44 
Die Frage ist was gemacht wird. aber ein Timer ist auch sowas wie ne repeat until Schleife, zur Not stellt man das Interval auf 1ms...das ist in 99% aller Fälle dann genau wie ne repeat until Schleife, weil er da auch durchgehend rechnet. Es gibt da aber auch noch diese Sache mit dem OnIdle...

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 02.05.10 22:46 
user profile iconMatty92 hat folgendes geschrieben Zum zitierten Posting springen:
wie pausiere ich eine repeat-until schleife, führe anweisungen aus (Sachen ändern, weitere Fenster öffnen oder gar nichts tun) und lasse sie dann weiterlaufen?


Gar nicht, denn der Ansatz ist falsch. Dieses zyklische Abfragen, ob irgendetwas passiert ist, heißt „pollen“ und so ziemlich das dreckigste, was man unter ereignisorientierten Betriebsprogrammen (das die graphischen nach meinem Wissen alle sind) tun kann. Diese Programmiermethode war zu Zeiten von CPM, DOS & Co. nahezu die einzig mögliche und gängige (und ist vielleicht auch heute noch in manchen Textkonsolen bzw. Konsolenprogrammen nötig). Es/sie kostet zudem unnötig Ressourcen. Stell Dir mal vor, auch andere Programme wären so geschrieben. Allein zwei laufende Programme dieser Art könnten den Computer erheblich und mithin deutlich ausbremsen, besonders, wenn er nur einen Prozessor(kern) hat.

Also, Ereignisorientierung, auf Ereignisse zu reagieren - so z.B. auf einen Tastendruck - kann nur der einzig sinnvolle Ansatz sein.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 03.05.10 08:21 
Wenn du genau das willst, wäre die Antwort Fibers (Beispiel, Library). Aber ich denke es gibt eine bessere Lösung ohne Fibers. Was machst du denn in der Schleife?

Sachen ändern und Fenster öffnen kannst du auch einfach so in einer repeat-Schleife, ohne die irgendwie abbrechen zu müssen.
Matty92 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Mi 12.05.10 22:31 
Hi,
ok, danke euch :). Die Werte werden gespeichert. Wenn die repeat-until-Schleife beendet wird und später wieder gestartet, wird an der Stelle weitergerechnet an der aufgehört wird.
Das verlangsamen hab ich jetzt mit einem Schieberegler und Sleep gelöst, irgendwie will das Timerprinzip nicht in meine Kopf rein, oder ich mach es wieder zu kompliziert.

Viele Grüße,
Matty