C++ 如何使用vtk实时可视化在另一个线程中运行的计算

C++ 如何使用vtk实时可视化在另一个线程中运行的计算,c++,pthreads,vtk,C++,Pthreads,Vtk,我想用可视化工具包在另一个线程中实时可视化正在运行的计算。计算会给出一组新的值,以便在每次迭代中可视化,图形线程必须知道这一点并加载新值 一种方法是让主线程轮询计算的状态。理想情况下,我不想做任何投票,但如果没有其他方法,我会 我能想到的最好的方法是让计算线程在每次迭代计算时将事件推送到主线程的事件队列上,然后由GUI处理。我不知道该如何做,或者是否可以用线程安全的方式来做 我正在使用pthreads在linux上的gcc/C++中使用vtk。我认为这是一种标准方法。为窗口处理(即窗口消息处理)

我想用可视化工具包在另一个线程中实时可视化正在运行的计算。计算会给出一组新的值,以便在每次迭代中可视化,图形线程必须知道这一点并加载新值

一种方法是让主线程轮询计算的状态。理想情况下,我不想做任何投票,但如果没有其他方法,我会

我能想到的最好的方法是让计算线程在每次迭代计算时将事件推送到主线程的事件队列上,然后由GUI处理。我不知道该如何做,或者是否可以用线程安全的方式来做


我正在使用pthreads在linux上的gcc/C++中使用vtk。

我认为这是一种标准方法。为窗口处理(即窗口消息处理)创建单独的线程,有时将数据放入窗口(即更新图像)

MathGL的类似过程如下所示(请参阅)

//-----------------------------------------------------------------------------
#包括
#包括
#包括
mglPoint pnt;//可变数据的一些全局变量
//-----------------------------------------------------------------------------
整数样本(mglGraph*gr,void*)
{
gr->Box();gr->Line(mglPoint(),pnt,“Ar2”);//只要画一个向量
返回0;
}
//-----------------------------------------------------------------------------
void*mgl_fltk_tmp(void*){mglFlRun();返回0;}
int main(int argc,字符**argv)
{
mglGraphFLTK-gr;
gr.Window(argc,argv,sample,“test”);//创建窗口
静态pthread_t tmp;
pthread_create(&tmp,0,mgl_fltk_tmp,0);
pthread_detach(tmp);//在单独的线程中运行窗口处理

对于(int i=0;i使用vtkCommand(或适当的派生类)在主线程中侦听您感兴趣的对象上的修改事件。然后,您可以在回调发生时更新渲染器和关联类

但是很多VTK类都不是线程安全的。在进行渲染时,需要暂停更新。否则,在尝试读取和写入相同内存时,它会出错

//-----------------------------------------------------------------------------
#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
}
//-----------------------------------------------------------------------------