1

我正在开发一个模拟器。我为 GUI 选择了 QT。我的项目涉及大量数据操作,我使用 QT 只是为了绘制我的结果。

我的代码结构是这样的,我的主函数包含我的数据的全局对象、QT GUI 的对象和用于操作此数据的其他对象。我需要每 30 毫秒修改一次这些数据。我还附上了我的主文件的简化版本。

我的问题是在退出 QT 对象之前我无法调用其他对象(GUI 除外)的函数。我已经在 QT 中单独实现了计时器,它可以绘制新数据并且工作正常。我要做的就是在独立于 QT 对象的特定时间间隔调用我的 ai 和 phySim 对象。我希望这三个对象完全独立。

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();  
} 
4

3 回答 3

2

看看 Qt 中的信号和插槽。将关闭 GUI 时发出的“关闭”信号连接到“startThread”插槽。让您的 AI 和 Simulation 在单独的线程中运行,如果它们需要交互,请再次使用信号/插槽。

你说你希望这三个对象是“完全独立的”——那么你应该给他们每个人自己的线程。

于 2010-02-23T23:03:03.993 回答
0

也许您不应该尝试不运行app.exec(),而是创建一个自定义(几乎)无限循环,processEvents()在该循环内调用,然后updateWorld()等待 30 毫秒(或更少,因为函数执行需要一些毫秒)。绘图是 Qt 的一部分(您应该传递模拟器的实例并添加一个渲染方法(在纯 OpenGL 中可能是最好的,因为这可以通过 QGLWidget 通过 Qt 层)。在QGLWidget I内paint()或分别调用该方法paintGL()希望这会有所帮助(有点),你应该阅读QGLWidget doc

注意:您必须以信号的形式编写一些包装器,调用您的 simulationObj 方法,否则在 Qt 中将无法进行 UI 交互。

于 2010-02-24T01:25:30.840 回答
0

我打算建议在 QApplication 上覆盖一些事件方法,但事件循环可能会很棘手,因为你有一些“子循环” http://labs.trolltech.com/blogs/2010/02/23/unpredictable-exec。在 2009 年的一次技术讲座中,有一部分也解释了这一点。

一种方法是通过使用客户端服务器体系结构来进一步分离您的 GUI。您的 sim 可以是服务器,Qt GUI 可以是客户端。Qt 中有一些使用套接字的不错示例。

另一种方法是使用 QTimer 来更新(或轮询)您的 Sim。你甚至可能不需要线程。

 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();
 }
于 2010-02-24T10:02:16.913 回答