Pregunta

Estoy desarrollando un simulador. He elegido QT para la interfaz gráfica de usuario. Mi proyecto consiste en una gran cantidad de manipulación de los datos y lo uso QT sólo para trazar mis resultados.

Mi estructura del código es tal que mi función principal contiene un objeto global de mis datos, un objeto de la interfaz gráfica de usuario QT y otros objetos para manipular estos datos. Tengo que modificar estos datos en cada 30 ms. También he adjuntado una versión simplificada de mi archivo principal.

Mi problema es que no puedo llamar a las funciones de mis otros objetos (que no sean la interfaz gráfica de usuario) antes de salir del objeto de QT. He implementado temporizadores en el intervalo QT en el aislamiento que traza los nuevos datos y funciona bien. Todo lo que quiero hacer es llamar a mi objeto ai y phySim a un independiente intervalo de tiempo particular del objeto de QT. Quiero que estos tres objetos que sean completamente independientes.

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();  
} 
¿Fue útil?

Solución

Tal vez usted debería tratar de no ponga en marcha el app.exec(), pero en lugar de crear una costumbre (casi) bucle infinito, processEvents() llamada dentro de ese bucle y su updateWorld() además de una espera de 30 ms (o un poco menos, debido a la ejecución de la función se llevará a algunos ms). El dibujo es entonces parte de Qt (debe pasar la instancia de su simulador y añadir el método a render (tal vez mejor en el más puro OpenGL, ya que esto puede ser pasado a través de la capa de Qt a través de un QGLWidget). Llama a ese método dentro paint() o paintGL() respectivly de QGLWidget espero que esto ayuda (un poco), debe leer QGLWidget doc

Nota:. Usted tiene que escribir algunas envolturas en forma de señales, llamando a sus métodos simulationObj, de lo contrario no hay interacción interfaz de usuario será posible dentro de Qt

Otros consejos

Tome un vistazo a las señales y slots en Qt. Conectar una señal "cerrada" que emiten cuando cierra su interfaz gráfica de usuario a una ranura "StartThread". Tienen su IA y simulación en curso en hilos separados y si tienen que interactuar, hacer uso de señales / ranuras de nuevo.

Usted dice que quiere los tres objetos que sean "totalmente independiente" - entonces usted debe dar a cada uno de ellos su propio hilo

.

Yo iba a sugerir anulando algunos métodos de evento en QApplication pero bucles de eventos puede ser complicado ya que tiene algunos "bucles niño" http://labs.trolltech.com/blogs/2010/02/23/unpredictable-exec . En una de las conversaciones Tech 2009 en que hay una parte que explica esto también.

Un método consiste en separar su interfaz gráfica de usuario un poco más mediante el uso de una arquitectura cliente-servidor. Su SIM puede ser el servidor y Qt GUI del cliente. Hay algunas muestras agradables en Qt utilizando sockets.

Otro enfoque es utilizar QTimer a la actualización (o sondeo) tu Sim. Usted puede no necesitar hilos.

 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();
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top