4

視覚化ツールキットを使用して、実行中の計算を別のスレッドでリアルタイムに視覚化したいと思います。計算は、反復ごとに視覚化される新しい値のセットを吐き出します。グラフィカルスレッドは、これをある程度認識し、新しい値をロードする必要があります。

これを行う1つの方法は、メインスレッドに計算の状態をポーリングさせることです。理想的にはポーリングを行いたくないのですが、他に方法がない場合は行います。

私が考えることができる最善の方法は、計算の反復ごとに計算スレッドがイベントをメインスレッドのイベントキューにプッシュし、それがGUIによって処理されるようにすることです。これを実行する方法、またはスレッドセーフな方法で実行できるかどうかはわかりません。

Linuxのgcc/C++でpthreadを使用してvtkを使用しています。

4

2 に答える 2

2

vtkCommand (または適切な派生クラス) を使用してメイン スレッドで、関心のあるオブジェクトの Modified イベントをリッスンします。その後、コールバックが発生したときに、レンダラーと関連するクラスを更新できます。

しかし、多くの VTK クラスはスレッドセーフではありません。レンダリング中は更新を一時停止する必要があります。そうしないと、同じメモリを読み書きしようとしているときにセグメンテーション違反が発生します。

于 2011-12-23T08:11:28.597 に答える
1

標準的な方法だと思います。ウィンドウ処理 (つまり、ウィンドウ メッセージの処理) 用に別のスレッドを作成し、データをウィンドウに入れます (つまり、画像を更新します)。

MathGL での同様の手順は次のようになります (計算と並行して FLTK/GLUT/Qt ウィンドウを作成する方法を参照してください) 。

//-----------------------------------------------------------------------------
#include <mgl/mgl_fltk.h>
#include <pthread.h>
#include <unistd.h>

mglPoint pnt;  // some global variable for changable data
//-----------------------------------------------------------------------------
int sample(mglGraph *gr, void *)
{
  gr->Box();  gr->Line(mglPoint(),pnt,"Ar2"); // just draw a vector
  return 0;
}
//-----------------------------------------------------------------------------
void *mgl_fltk_tmp(void *)      {       mglFlRun();     return 0;       }
int main (int argc, char ** argv)
{
  mglGraphFLTK gr;
  gr.Window(argc,argv,sample,"test");  // create window
  static pthread_t tmp;
  pthread_create(&tmp, 0, mgl_fltk_tmp, 0);
  pthread_detach(tmp);    // run window handling in the separate thread
  for(int i=0;i<10;i++)   // do calculation
  {
    sleep(1);             // which can be very long
    pnt = mglPoint(2*mgl_rnd()-1,2*mgl_rnd()-1);
    gr.Update();          // update window
  }
  return 0;   // finish calculations and close the window
}
//-----------------------------------------------------------------------------
于 2011-06-02T20:32:26.073 に答える