Domanda

sto sviluppando un simulatore. Ho scelto QT per la GUI. Il mio progetto comporta un sacco di manipolazione dei dati e uso QT solo per tracciare i miei risultati.

La mia struttura del codice è tale che la mia funzione principale contiene un oggetto globale dei miei dati, un oggetto della GUI QT ed altri oggetti per la manipolazione di questi dati. Ho bisogno di modificare questi dati in ogni 30 ms. Ho anche allegato una versione semplificata del mio file principale.

Il mio problema è che non riesco a chiamare funzioni dei miei altri oggetti (diversi dal GUI) prima di uscire l'oggetto QT. Ho implementato i timer in QT in isolamento che riporta i nuovi dati e funziona bene. Tutto quello che voglio fare è chiamare il mio oggetto AI e phySim in un momento particolare intervallo di indipendente dell'oggetto QT. Voglio che questi tre oggetti di essere completamente indipendenti.

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();  
} 
È stato utile?

Soluzione

Forse si dovrebbe cercare di non far funzionare il app.exec(), ma invece di creare un personalizzato (quasi) loop infinito, chiamare processEvents() all'interno di quel ciclo e il vostro updateWorld() più un'attesa di 30 ms (o un po 'meno, a causa dell'esecuzione della funzione avrà alcuni ms). Il disegno è quindi parte di Qt (si dovrebbe passare l'istanza del simulatore e aggiungere un metodo Render (forse meglio in puro OpenGL, in quanto questo può essere fatto passare attraverso lo strato di Qt tramite un QGLWidget). Chiamare quel metodo all'interno paint() o paintGL() respectivly per QGLWidget Spero che questo aiuta (un po '), si dovrebbe leggere QGLWidget doc

Nota:. Dovrete scrivere alcuni involucri a forma di segnali, chiamare i tuoi metodi simulationObj, altrimenti nessuna interazione UI sarà possibile entro Qt

Altri suggerimenti

Date un'occhiata alle segnali e slot in Qt. Collegare un segnale "chiuso" che si emettono quando si chiude il GUI per uno slot "startThread". Hanno il tuo AI e simulazione in esecuzione in thread separati e se hanno bisogno di interagire, fare uso di segnali / slot di nuovo.

Tu dici che vuoi i tre oggetti di essere "completamente indipendente" -. Allora si dovrebbe dare a ciascuno di loro il proprio thread

Stavo per suggerire l'override alcuni metodi di eventi su QApplication ma i cicli di eventi può essere difficile dato che avete un po 'di "bambino loop" http://labs.trolltech.com/blogs/2010/02/23/unpredictable-exec . In una delle 2009 colloqui Tech su c'è una parte che spiega anche questo.

Un approccio è quello di separare la vostra interfaccia grafica un po 'di più utilizzando un'architettura Client Server. Il vostro sim può essere il server e Qt GUI del client. Ci sono alcune belle campioni in Qt che utilizzano i socket.

Un altro approccio è quello di utilizzare QTimer per aggiornare (o sondaggio) il vostro Sim. Si potrebbe anche non avere bisogno di fili.

 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();
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top