2014-01-16 25 views
3

我想要一個包含濁點可視化工具的類。 這裏是我的代碼:使用「pcl :: visualization」在來自不同實例類的不同線程中

class my_vis 
{ 
     void vis_func() 
    { 
     pcl::visualization::PCLVisualizer *vis ; 
     vis = new pcl::visualization::PCLVisualizer("octree viewer"); 
     // this "vis" is just used in this function and no other place 
    } 

    void execute(){ 
     //Start visualizer in a thread 
     boost::thread* visThread = new boost::thread(boost::bind(&my_vis::vis_func, this)); 
     // bla bla 
    } 
} 
int main() 
{  
    my_vis vis1(); 
    vis1.execute(); 
    my_vis vis2(); 
    vis2.execute(); 
    std::getchar(); 
    return 0 ; 
} 

現在我有一個類可以在「主」被實例化展示臺。當我從類「my_vis」中創建一個實例時,程序運行時,每件事情都可以。但我需要兩個或更多的實例。當我初始化多個實例時,發生錯誤: BLOCK_TYPE_IS_VALID 我認爲這是因爲使用線程。但是我的項目中需要線程化。

你能幫我嗎? 非常感謝您的耐心和幫助:)

P.S.我正在使用PCL 1.7

+0

我測試了可視化類boost,boost :: shared_ptr的共享指針 vis(new pcl :: visualization :: PCLVisualizer(window_name,假));但沒有任何改變。 –

回答

4

兩天後,我終於解決了這個問題。

我注意到pcl :: visualization :: PCLVisualizer和「SpinOnce」函數的構造函數,並且我認識到,如果您放置靜態鎖定,以便多個對象中只有一個線程可以訪問這些函數,那麼問題將得到解決。以前,我在這些函數上放了非靜態鎖,正如你所知,本地鎖只是在它們創建的同一個對象(不是從一個類實例化的整個對象)中工作。所以我定義的my_vis類的靜態鎖:

private static boost::mutex vis_mutex; 
    boost::mutex my_vis::vis_mutex; //storage for static lock 

和替換 「VIS-> spinOnce(1)」 與

{ 
      boost::mutex::scoped_lock vis_lock(vis_mutex); 
      vis->spinOnce(); 
    } 

我仍然認爲它不是一個永久性的解決方案,而這個bug最好由pcl開發人員解決:)

+0

當處理巨大的點雲數據時,這個解決方案太糟糕了! :) –

+0

你能提供整個書面代碼嗎?我不明白在哪裏取代「vis-> spinOnce(1)」。謝謝,這對所有人都有幫助 – SPS

相關問題