Registriert: Sa Nov 02, 2002 18:06 Beiträge: 299 Wohnort: Dresden
Hi,
ich arbeite gerade an einem Projekt für die Schule und hab ein Problem:
Ich hab eine rekursive Funktion und möchte sie an einer bestimmten Stelle stoppen, bis eine Taste gedrückt wird. Hab es mal mit einer repeat..until Schleife mit einem ProcessMessages probiert. Problem: Das Programm geht sofort auf 0fps und stürzt ab. (ach ja, ich progge in VCL)
Pseudocode:
Code:
procedure DoSomeThing()
begin
if irgendwas = 1 then
begin
warte_auf_Tastendruck;
machwas
end
else
DoSomeThing
end;
MfG HomerS
_________________ "Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
@HomerS :
Bitte konkretisier dein Problem mal ein wenig, mir fällts nämlich ein wenig schwer dein Problem zu erkennen.Evtl. liegt dein Problem ganz einfach an einer zu tiefen Rekursion.
Da ich dein Problem nicht genau kenne, kanns sein das folgende Lösung nicht applikabel ist, aber rein vom Prinzip her sollte das doch funzen :
Code:
repeat
if Irgendwas = 1 then
begin
if TasteGedrückt then
machwas;
end
else
DoSomeThing
ProcessMessages;
end;
@SM3D :
Wenn du nichts konstruktives zu einem Thema beizutragen hast, dann unterlass solche Postings bitte.Sie nützen weder dem Threadersteller, noch tragen sie zur Übersicht bei.
Registriert: Sa Nov 02, 2002 18:06 Beiträge: 299 Wohnort: Dresden
Also meine Idee war folgende
Code:
if n = 1 then
begin
repeat
ProcessMessages;
until TasteGedrückt;
machdas;
end;
else
REKURSION
ES soll also wenn n = 1 solange gewartet werden, bis eine Taste gedrückt wird. Es soll aber nichts anderes gemacht werden. Also einfach eine Unterbrechung im Programmfluss. (Wirkung wie sleep())
MfG HomerS
edit: Bei der Lösung oben passiert folgendes. Ich rendere ja über ApplicationEvents.Idle. Doch wenn der halt warten soll, geht die fps Anzeige sofort auf 0 und wenn ich die Taste drücke passiert nix.
_________________ "Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
HomerS hat geschrieben:
edit: Bei der Lösung oben passiert folgendes. Ich rendere ja über ApplicationEvents.Idle. Doch wenn der halt warten soll, geht die fps Anzeige sofort auf 0 und wenn ich die Taste drücke passiert nix.
Aha.Hab dein Edit grade erste entdeckt.Wenn du dich in ner repeat...until-Schleife befindest, ist deine Anwendung AFAIK zu keinem Zeitpunkt unbeschäftigt (also Idle), und dein OnIdle-Event wird deshalb wohl nicht aufgerufen.An deiner Stelle würde ich deshalb auf das OnIdle-Event verzichten, und stattdessen das Rendern in nem eigenen Loop machen.Wenn ich nen eignen Renderloop verwende, dann platziere ich nen Timer auf der Form (50ms), und setze denn am Ende des OnCreate auf Enabled.Nach 50ms startet dieser Timer dann meinen Renderloop in ner repeat...until-Schleife.
P.S.: Hoffe mal das ich dein Problem irgendwie getroffen hab.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
HomerS hat geschrieben:
ABer ich ruf doch ProcessMEssages auf, hilft das nicht?
Nein.ProcessMessages verarbeitet ja nur die anstehende Nachrichtenschlange, also solche Sachen wie Buttonklicks, Verschieben des Fenster, Mausbewegungen, etc.
Das Idle-Event ist allerdings keine Windowsnachricht in dem Sinne (kann mich auch irren, bin mir aber fast 100%ig sicher), sondern wird nur dann aufgerufen (aufgerufen, also nicht in die Nachrichtenschlange eingereiht), wenn deine Anwendung nichts zu tun hat.
Allerdings kannst du (dürfte eigentlich keine Probleme machen) das OnIdle-Ereignis selbst in der Schleife aufrufen, also so :
Registriert: Sa Nov 02, 2002 18:06 Beiträge: 299 Wohnort: Dresden
Doch net, habs hochgeladen.
Aufjedenfall, geh auf Solve, fokusiere das Memo (nur Leertaste und nur dort wird angenommen). Jetzt sollte eigentlich weitergerendert werden. Wenn der aber mit der Lösung ferrtig ist, gehts ganz normal weiter.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich persönlich halte ein Warteschleife für ziemlich ungünstig. Ich habe mir zwar auch mal den Quelltext gezogen aber ich verstehe das Problem irgendwie nicht so ganz.
Das sinnvollste wäre aber eine Möglichkeit die das Programm anhält. Ein Fenster was mit ShowModal aufgerufen wird sollte dein Problem auch lösen. Da die Anwendung eh still steht ist das ja eigentlich auch egal, oder?
Registriert: Sa Nov 02, 2002 18:06 Beiträge: 299 Wohnort: Dresden
Stillstehen darf es nicht! Die Verzögerung ist nur dafür da, dass man jede einzelne Bewegung der Steine sieht. Ohne eine Verzögerung sieht man ja nicht, welcher Stein sich wann bewegt.
_________________ "Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.