在来自不同类的实例的不同线程中使用“pcl :: visualization”

时间:2014-01-16 07:22:25

标签: c++ multithreading point-cloud-library

我想要一个在云点上包含可视化工具的类。 这是我的代码:

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 ;
}

现在我有一类可视化器,可以在“main”中实例化。当我从类“my_vis”中只创建一个实例时,程序运行时每件事都可以。但我需要两个或更多实例。当我初始化多个实例时,发生错误: BLOCK_TYPE_IS_VALID 我认为这是因为使用线程。但是在我的项目中需要线程化。

你能帮帮我吗? 非常感谢您的耐心和帮助:)

P.S。我正在使用PCL 1.7

1 个答案:

答案 0 :(得分:6)

两天后,我终于解决了这个问题。

我注意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 (); 
    } 

我仍然认为它不是一个永久的解决方案,这个错误最好由pcl开发人员解决:)