1

シミュレーターを開発しています。GUI には QT を選択しました。私のプロジェクトには多くのデータ操作が含まれており、結果をプロットするためだけに QT を使用しています。

私のコード構造は、メイン関数にデータのグローバル オブジェクト、QT GUI のオブジェクト、およびこのデータを操作するためのその他のオブジェクトが含まれるようになっています。このデータは 30 ミリ秒ごとに変更する必要があります。メインファイルの簡略版も添付しました。

私の問題は、QT オブジェクトを終了する前に、他のオブジェクト (GUI 以外) の関数を呼び出せないことです。新しいデータをプロットして正常に動作するタイマーを QT に単独で実装しました。私がしたいのは、QT オブジェクトに依存しない特定の時間間隔で ai および phySim オブジェクトを呼び出すことだけです。この 3 つのオブジェクトを完全に独立させたいと考えています。

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 を閉じるときに発行する「closed」シグナルを「startThread」スロットに接続します。AI とシミュレーションを別々のスレッドで実行し、相互作用が必要な場合は、シグナル/スロットを再度使用します。

あなたは、3 つのオブジェクトを「完全に独立」させたいと言いますが、それなら、それぞれに独自のスレッドを与える必要があります。

于 2010-02-23T23:03:03.993 に答える
0

QApplication でいくつかのイベント メソッドをオーバーライドすることを提案するつもりでしたが、いくつかの「子ループ」http://labs.trolltech.com/blogs/2010/02/23/unpredictable-execがあるため、イベント ループは扱いにくい場合があります。2009 年の Tech talks の 1 つにも、これを説明する部分があります。

1 つのアプローチは、クライアント サーバー アーキテクチャを使用して、GUI をもう少し分離することです。あなたの sim がサーバーになり、Qt GUI がクライアントになります。Qt には、ソケットを使用した素敵なサンプルがいくつかあります。

もう 1 つの方法は、QTimer を使用してシムを更新 (またはポーリング) することです。スレッドさえ必要ないかもしれません。

 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 に答える
0

を実行するのapp.exec()ではなく、代わりにカスタムの (ほぼ) 無限ループを作成し、processEvents()そのループ内で呼び出し、updateWorld()さらに 30 ミリ秒 (関数の実行に数ミリ秒かかるため、それよりも少し短く) 待機する必要があります。描画は Qt の一部です (シミュレーターのインスタンスを渡し、render メソッドを追加する必要があります (これは QGLWidget を介して Qt レイヤーを介して渡すことができるため、おそらく純粋な OpenGL で最適です) 。QGLWidget I 内またはpaint()それぞれに対してそのメソッドを呼び出します。paintGL()これが(少し)役立つことを願っています。QGLWidget docを読む必要があります

注: いくつかのラッパーをシグナルの形式で記述し、simulationObj メソッドを呼び出す必要があります。そうしないと、Qt 内で UI とのやり取りができなくなります。

于 2010-02-24T01:25:30.840 に答える