2011-06-02 22 views
4

我想用可視化工具包實時顯示另一個線程中的運行計算。該計算吐出了一組新的值,每次迭代都可視化,並且圖形線程必須知道如何知道並加載新值。如何使用vtk實時顯示在另一個線程中運行的計算

做到這一點的一種方法是讓主線程輪詢計算的狀態。理想情況下,我不想做任何投票,但如果沒有其他方式,那麼我會。

我能想到的最好方法是讓計算線程將事件推送到主線程的事件隊列中,然後每次迭代計算,然後通過GUI進行處理。我不知道如何去做這件事,或者如果可以以線程安全的方式完成。

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

回答

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

聽你感興趣的對象上修改的事件,在使用vtkCommand主線程(或適當的派生類)。當發生回調時,您可以更新您的渲染器和關聯的類。

但許多VTK類不是線程安全的。您需要在渲染時暫停更新。否則,它會在嘗試讀取和寫入相同內存時發生段錯誤。

相關問題