Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 08:05

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Funktion bis Tastendruck stoppen
BeitragVerfasst: Do Sep 25, 2003 14:59 
Offline
DGL Member
Benutzeravatar

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:
  1.  
  2. procedure DoSomeThing()
  3.  
  4.   begin
  5.   if irgendwas = 1 then
  6.     begin
  7.     warte_auf_Tastendruck;
  8.     machwas
  9.     end
  10.   else
  11.     DoSomeThing
  12.   end;
  13.  

MfG HomerS

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 15:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 22, 2003 19:56
Beiträge: 104
Wohnort: Lübeck, Germany
So weit ich sehe hast Du auf jedenfall Semikolons vergessen, oder ist das absicht !? 8)

_________________
Gruß Sascha
[SM3D Game Development]


WERBUNG für ein gutes Projekt
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 15:08 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Pseudocode = muss nicht 100 % stimmen. Mir gings mehr ums Prinzip als um die Schonheit. Und außerdem war ich zu faul alle Semis zu setzen.

Ach ja, 3 min das ist ja Bestzeit

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 15:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 22, 2003 19:56
Beiträge: 104
Wohnort: Lübeck, Germany
Sorry, war auch nicht so gemeint, warte mal ich werde den Code gleich mal testen, so sehe ich das nicht so. :wink: :D

_________________
Gruß Sascha
[SM3D Game Development]


WERBUNG für ein gutes Projekt
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 15:16 
Offline
DGL Member
Benutzeravatar

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:
  1. repeat
  2. if Irgendwas = 1 then
  3.  begin
  4.  if TasteGedrückt then
  5.   machwas;
  6.  end
  7. else
  8.  DoSomeThing
  9. ProcessMessages;
  10. 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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 15:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 22, 2003 19:56
Beiträge: 104
Wohnort: Lübeck, Germany
Ja geht in Ordnung, noch mal Sorry. :cry: :wink:
Hatte einen ähnlichen Code, aber Du warst schon schneller.

_________________
Gruß Sascha
[SM3D Game Development]


WERBUNG für ein gutes Projekt
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 16:00 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Also meine Idee war folgende
Code:
  1.  
  2. if n = 1 then
  3.   begin
  4.   repeat
  5.   ProcessMessages;
  6.   until TasteGedrückt;
  7.   machdas;
  8.   end;
  9. else
  10.   REKURSION
  11.  
  12.  


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"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 18:34 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 18:37 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
ABer ich ruf doch ProcessMEssages auf, hilft das nicht?

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 18:41 
Offline
DGL Member
Benutzeravatar

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 :
Code:
  1. repeat
  2. ApplicationEventsIdle(self, True);
  3. ...
  4. until ...

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 19:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Hast ne PM

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 25, 2003 19:27 
Offline
DGL Member
Benutzeravatar

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.

Link: http://www.delphigl.com/upload/HomerS_Hanoi.zip

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 26, 2003 15:25 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 02, 2002 18:06
Beiträge: 299
Wohnort: Dresden
Ich versuch mal folgendes: innerhalb der Warte-SChleife die Render-Funktion aufrufen. GIbt's vielleicht noch ein paar andere Vorschläge?

_________________
"Ich würde ja gern die Welt verändern, aber Gott gibt mir den Quelltext nicht"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 26, 2003 15:54 
Offline
DGL Member
Benutzeravatar

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 26, 2003 16:06 
Offline
DGL Member
Benutzeravatar

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"


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]