我想用可视化工具包实时可视化另一个线程中正在运行的计算。计算会产生一组新的值以在每次迭代时可视化,并且图形线程必须知道这一点并加载新值。
一种方法是让主线程轮询计算的状态。理想情况下,我不想进行任何民意调查,但如果没有其他方法,那么我会的。
我能想到的最好方法是让计算线程在计算的每次迭代中将一个事件推送到主线程的事件队列中,然后由 GUI 处理。我不确定如何去做,或者是否可以以线程安全的方式完成。
我正在使用 pthreads 在 linux 上的 gcc/C++ 中使用 vtk。
使用 vtkCommand(或适当的派生类)在主线程中侦听您感兴趣的对象上的 Modified 事件。然后,您可以在回调发生时更新您的渲染器和关联的类。
但是许多 VTK 类不是线程安全的。您需要在渲染发生时暂停更新。否则,它会在尝试读取和写入相同的内存时出现段错误。
我认为这是一种标准方式。为窗口处理(即窗口消息处理)创建单独的线程,有时将数据放入窗口(即更新图像)。
与 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
}
//-----------------------------------------------------------------------------