我想用可视化工具包实时显示另一个线程中的运行计算。计算会在每次迭代时显示一组新的值,并且图形线程必须知道如何知道并加载新值。
执行此操作的一种方法是让主线程轮询计算的状态。理想情况下,我不想做任何民意调查,但如果没有别的办法,那么我会。
我能想到的最好方法是让计算线程在每次迭代计算时将事件推送到主线程的事件队列中,然后由GUI处理。我不知道该怎么做,或者是否能以线程安全的方式完成。
我正在使用pthreads在linux上的gcc / C ++中使用vtk。
答案 0 :(得分:2)
使用vtkCommand(或相应的派生类)在主线程中监听您感兴趣的对象上的Modified事件。然后,您可以在回调发生时更新渲染器和关联的类。
但是许多VTK类都不是线程安全的。渲染发生时,您需要暂停更新。否则,它会在尝试读取和写入相同内存时发生段错误。
答案 1 :(得分:1)
我认为这是一种标准方式。为窗口处理(即窗口消息处理)创建单独的线程,并且有时将数据放入窗口(即更新图像)。
MathGL的类似程序如下(参见How I can create FLTK/GLUT/Qt window in parallel with calculation?)
//-----------------------------------------------------------------------------
#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
}
//-----------------------------------------------------------------------------