Frage

Ich entwickle einen Simulator. Ich habe QT für die GUI ausgewählt. Mein Projekt beinhaltet eine Menge von Manipulation von Daten und ich verwende QT nur meine Ergebnisse plotten.

Meine Code-Struktur ist so, dass meine Hauptfunktion ein globales Objekt meiner Daten enthält, ein Objekt der QT-GUI und andere Objekte für diese Daten zu manipulieren. Ich brauche diese Daten alle 30 ms zu ändern. Ich habe auch eine vereinfachte Version meiner Haupt Datei angehängt.

Mein Problem ist, dass ich nicht Funktionen meiner anderen Objekte (außer dem GUI) nennen kann, bevor das QT-Objekt zu verlassen. Ich habe Timer in QT in Isolation implementiert, die die neuen Daten Plots und funktioniert einwandfrei. Alles, was ich tun möchte, ist mein ai und phySim in einem bestimmten Zeitintervall unabhängig von der QT-Objekt-Objekt aufrufen. Ich möchte diese drei Objekte völlig unabhängig sein.

world* _world;
int main(int argc, char *args[])

{
_world = new world();


gui *GUI; ///QT object

ai *AI;//object to manipulate data

phySim *sim;//object to manipulate data

/////////////////////////////////// this gets executed only when i close the QT gui
    AI = new ai(_world); 
AI->doSomething();

sim = new phySim(_world);
sim->updateWorld();
//////////////////////////////////////////////////////////////////////////////

QApplication app(argc,args);
GUI = new gui(_world);  
GUI->show();


return app.exec();  
} 
War es hilfreich?

Lösung

Vielleicht sollten Sie versuchen, die app.exec() nicht nicht ausgeführt, sondern eine benutzerdefinierte (fast) unendliche Schleife, Anruf processEvents() innerhalb dieser Schleife und Ihre updateWorld() und eine Wartezeit von 30 ms (oder etwas weniger, aufgrund der Funktion der Ausführung erstellen nehmen einige ms). ein Render-Methode (vielleicht am besten in reinen OpenGL Zeichnung wird dann Teil von Qt (sollten Sie die Instanz des Simulators passieren und fügen, da dies über eine QGLWidget durch die Qt-Schicht übergeben werden.) diese Methode innerhalb paint() Rufen Sie an oder respectivly paintGL() für QGLWidget ich hoffe, das hilft (ein wenig), sollten Sie QGLWidget doc

. Hinweis: Sie werden einige Wrapper in Form von Signalen zu schreiben, Ihre simulationObj Methoden aufrufen, da sonst keine UI Interaktion möglich sein wird, innerhalb von Qt

Andere Tipps

Werfen Sie einen Blick auf die Signale und Slots in Qt. Schließen Sie ein „geschlossenes“ Signal, dass Sie emittieren, wenn Sie Ihre GUI zu einem „Startthread“ Slot schließen. Haben Sie Ihre AI und Simulation in separaten Threads ausgeführt wird und wenn sie benötigen, um in Wechselwirkung treten, nutzen Signale / Slots wieder.

Sie sagen, Sie wollen, dass die drei Objekte „völlig unabhängig“ zu sein - dann sollten Sie jede von ihnen ihren eigenen Thread geben

.

Ich wollte überschreiben einige Ereignismethoden auf QApplication vorschlagen, aber Ereignisschleifen kann schwierig sein, da einige „Kinder loops“ haben http://labs.trolltech.com/blogs/2010/02/23/unpredictable-exec . In einem der 2009 Tech Gespräche über gibt es einen Teil, der dies auch erklärt.

Ein Ansatz ist die GUI ein bisschen mehr unter Verwendung einer Client-Server-Architektur zu trennen. Ihr sim kann der Server und Qt GUI vom Client. Es gibt einige schöne Proben in Qt über Sockets.

Ein weiterer Ansatz ist QTimer zu Update verwenden (oder Umfrage) Sim. Sie könnten nicht einmal Fäden müssen.

 void SomeGUI::SomeGUI(..)...
 {
   //Init sim
   m_World = new world();
   m_AI = new ai(m_World); 
   m_Sim = new phySim(m_World);

  ...
  //Connect timer
  QTimer *timer = new QTimer(this);
  connect(timer, SIGNAL(timeout()), this, SLOT(updateWorld()));
  timer->start(100); //or whatever interval works
  ...

 }

 void SomeGUI::updateWorld()
 {
   //Update sim state
   m_AI->doSomething();
   m_Sim->updateWorld();
   updateGUI();
 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top