Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Programm pausieren
ShuyiN - Sa 02.01.10 20:05
Titel: Programm pausieren
Hallo :)
In der Schule arbeiten wir an einem Programm, dass rekursiv alle Wege aus einem Labyrinth findet. Als Zusatzleistung habe ich eine 3D-Ansicht aus der Ego-Perspektive eingebaut, in der man sieht wie das Programm durchs Labyrinth läuft. Damit mein Lehrer das besser nachgucken könnte, wäre es gut einen Button zu haben, der das gesamte Programm für unbestimmte Zeit an irgendeiner Stelle pausieren und dann bei erneutem drücken weiterlaufen lassen kann. Mir fehlt eine Idee für eine möglichst einfache Umsetzung.
Gruß ShuyiN
FinnO - Sa 02.01.10 20:10
wie gehst du denn jetzt vor? Ich würde das ja im Prinzip so machen, dass ich ERST den gesamten Weg berechne, sei es backtracking oder anderes, und DANN über einen Algorithmus und OpenGL (was weiß ich, was du nutzt) das ganze dreidimensional nachbaue und abfahre. Dann sollte es reichen, in der Renderschleife, bzw. im Timer, der das zeichnet (weniger gute Lösung), einfach zu pausieren, sei es über eine Boolesche Variable oder eben über die "Enabled" Eigenschaft des Timers.
jaenicke - Sa 02.01.10 20:11
Richtige Lösung:
Den Status jeweils speichern und dann jeweils fortsetzen. // EDIT: Oder siehe
FinnO :mrgreen:
Notlösung:
Eine boolsche Variable / Feld benutzen und mittels Application.ProcessMessages und einer Schleife darauf warten, dass diese wieder umgeschaltet wird.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private FRunning: Boolean;
...
FRunning := False; while not FRunning do begin Sleep(10); Application.ProcessMessages; end; |
FinnO - Sa 02.01.10 20:13
wobei die Notlösung RICHTIG dreckig ist.
MaPsTaR - Sa 02.01.10 20:13
Ich würde nicht das Zeichnen, sondern die "Bewegung" des Programms durch das Labyrinth pausieren. Sonst bekommst du unschöne Effekte, wenn du das Fenster bewegst bzw. ein anderes darüberziehst, da deine aktuelle Ansicht nicht neugezeichnet wird.
FinnO - Sa 02.01.10 20:17
was pausiert wird, sei dann dem geneigten Leser selbst überlassen. Man könnte auch aus langeweile einfach einen Screenshot vom Formular machen und vor das DC ballern, wo wir gerade bei Notlösungen sind :mrgreen:
ShuyiN - Sa 02.01.10 20:37
das programm startet von einem punkt aus, öffnet dann nacheinander 4 Funktionen, die jeweils prüfen, ob in die Richtung der Weg frei ist und wenn ja begibt er sich dorthin und öffnet dann wieder für jede richtung je eine abfrage.
das ist zwar sehr umständlich, aber so wurde es uns als standard-programm gegeben.
ich lass dann immer ein neues bild zeichnen bevor die richtung getestet wird:
- zeichnen: blick nach norden
- norden überprüfen
- zeichnen: blick nach osten
- osten überprüfen
- zeichnen: blick nach süden
- süden überprüfen
- zeichnen: blick nach westen
- westen überprüfen
und für jede dieser richtungen, die frei ist, wird dann die obige reihenfolge mit anderen x/y-Werten durchgegangen
(x+1y / x-1,y / x,y+1 / x,y-1).
das mit der abfrage einer variable, die durch einen button verändert wird hab ich mir auch schon gedacht, aber das sind ja sehr viele abfragen, da ja für jede getestete richtung eine abfrage gemacht werden müsste, was bei einem 20/20-felder-labyrinth schon im 5-6-stelligen bereich liegt.
MaPsTaR - Sa 02.01.10 20:42
Aber du musst doch diese Funktionen irgendwie aufrufen, vermutlich über einen Timer oder OnIdle-Event der App.
Da kannst du doch eine If-Abfrage einbauen, dass deine Funktionen nur bei laufendem Programm ausgeführt werden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| if not Paused then begin - zeichnen: blick nach norden - norden überprüfen - zeichnen: blick nach osten - osten überprüfen - zeichnen: blick nach süden - süden überprüfen - zeichnen: blick nach westen - westen überprüfen end; |
edit:
Wenn es nicht zuviel Aufwand ist würde ich, wie von FinnO vorgeschlagen, erst den Weg berechnen und dann zeichnen.
ShuyiN - Sa 02.01.10 20:59
MaPsTaR hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| if not Paused then begin - zeichnen: blick nach norden - norden überprüfen - zeichnen: blick nach osten - osten überprüfen - zeichnen: blick nach süden - süden überprüfen - zeichnen: blick nach westen - westen überprüfen end; | |
dann könnte man nur immer nach 4 bildern pausieren! würde man die abfrage vor jede richtung setzen wären es aber sehr viele extra-abfragen. aber ich werd es wohl so machen müssen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| if not Paused then begin - zeichnen: blick nach norden - norden überprüfen end;
if not Paused then begin - zeichnen: blick nach osten - osten überprüfen end;
if not Paused then begin - zeichnen: blick nach süden - süden überprüfen end;
if not Paused then begin - zeichnen: blick nach westen - westen überprüfen end; |
edit: ich verstehe nicht genau wie mein problem gelöst werden soll, wenn ich erst die rekursion erst ganz durchlaufen lasse & danach erst zeiche. kann mir das jemand erklären?
das programm arbeitet mit 2 variablen für den x-&y-Wert, wo man sich gerade befindet im labyrinth und auf die bezieht sich die funktion zum zeichnen des ganzen.
FinnO - Sa 02.01.10 23:23
naja, über backtracking o.Ä. (keine Ahnung, was genutzt wird), kriegt man ja einen Weg nach draußen. jetzt kannst du beim Zeichen ja effektiv nur diesen Pfad berücksichtigen. Das ganze war allerdings vom Ansatz her mehr auf OpenGL und 3D-Modellerstellung abgestimmt, da würdest du nämlich den Pfad dann abmodellieren und eine Kamerafahrt machen (oder natürlich das ganze Labyrinth modellieren und dann den Weg abfahren)
ShuyiN - Sa 02.01.10 23:45
achso, klar. das wär sinnvoll wenn ich ne realistische ansicht hätte.
mein modell ist nur eine geometrische vorstellung des labyrinths, wie bei diesem alten windows-bildschirmschoner.
ShuyiN - Fr 08.01.10 03:18
Ich hab jetzt 2 Lösungen für mein Problem gefunden:
1. einen Pause-Button erstellen mit dem Code ( ShowMessage('pause...'); ).
Das Program macht erst weiter, nachdem man das erscheinende Feld bestätigt hat!
2. Delay & Timer
Gruß ShuyiN
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!