Seite 1 von 1

QEvent Loop

Verfasst: 15. September 2008 15:21
von Superheftig
Hi!
Wollte ein kleines qt basierendes spiel programmieren. Mein Problem ist dass jedes Spiel einen eigenen game loop hat, qt aber seinen eigenen event loop.
Mein game loop würde in etwas so aussehen
while(true) {
Modelle bewegen
Kollision berechnen
usw..
}
Da ich qglwidget benutzte benötige ich den qt event loop auch.
Es wäre natürlich möglich den game loop in einem eigenen Thread laufen zu lassen. Dieses bringt aber einige Probleme mit sich und daher keine vernünfige alternative.

Gibt es eine Möglichekeit die qt events irgendwie in dem gameloop abzuarbeiten?
Oder einen eigenen qt event loop zu schreiben in dem ich dann meine Tasks integrieren kann?

Re: QEvent Loop

Verfasst: 15. September 2008 15:25
von macman
Superheftig hat geschrieben:Dieses bringt aber einige Probleme mit sich und daher keine vernünfige alternative.
Dann solltest Du dich der Probleme annehmen.
Superheftig hat geschrieben:Gibt es eine Möglichekeit die qt events irgendwie in dem gameloop abzuarbeiten?
processEvents, aber das ist keine vernünftige Alternative :-)

Verfasst: 16. September 2008 14:00
von Superheftig
Hat sonst noch jemand eine Idee
Was ist denn mit der Benutzung der Klassen QEventLoop oder QAbstractEventDispatcher. Hat jemand damit schonmal gearbeitet und kann sagen ob man damit mein Porblem lösen kann

Verfasst: 16. September 2008 17:07
von upsala
Woher bekommst du eigentlich deine Benutzereingaben? Vom Qt-Event-System? Läufet deine Schleife endlos durch, oder sind da auch mal Wartezeiten drin?

Verfasst: 16. September 2008 17:41
von Superheftig
Filter momentan die Events mit QObject::EventFilter(); Angemeldet an der QApplication.
Der GameLoop läuft durchgehend falls sich deine Frage darauf bezieht. Wartezeiten währen ja auch dumm. Dadurch würd ja die frame rate nur künstlich sinken

Verfasst: 26. September 2008 16:31
von Superheftig
Das mit qt hat sich dann wohl erledigt. Muss ich das wohl mit der stl und sdl machen. Hab selber auch keine Vernünftie Lösung gefunden.

Verfasst: 30. September 2008 15:39
von Superheftig
Hab doch noch ne möglichkeit gefunden!
Ich benutzt nur einen Thread. Before ich das exec() von der QApplication ausführe starte ich einen QTimer mit msecs = 1. Das timeout() signal wird verbunden mit der Funktion des GameLoops. Der GameLoop hat dafür dann keine eigene while schleife mehr. Er loopt also nicht mehr selber sondern wird durch die Signals geloopt.
Funktioniert auch gant gut.
Meine Frage dazu: Der Timer ist natürlich viel schneller als die GameLoopFunktion. Was passiert Qt intern wenn das timeout() Signal emitiert wird aber der durchlauf des letzten GameLoops noch nicht fertig ist.
Wird die GameLoopFunktion dann trotzdem sofort ausgeführt obwohl die alte noch läuft?
Werden die Signale zwischengespeichert bis die Funktion durchgelaufen ist?
Und was passiert wenn ganz viele Signale darauf warten? Werden diese zusammengefaßt zu einem oder entsteht irgendwann eine Art StackOverflow, weil mehr dazu kommen als abgearbeitet werden.