Autor |
Beitrag |
Matty92
      
Beiträge: 34
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      

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)
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 02.05.10 21:38
Ein Timer ist zwar oft eine Lösung, aber hier bin ich da nicht so sicher.
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
      

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)
|
Verfasst: 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
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: So 02.05.10 22:46
Matty92 hat folgendes geschrieben : | 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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 
      
Beiträge: 34
|
Verfasst: 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
|
|
|