在类的不同实例的不同线程中使用"pcl::visualization"

using "pcl::visualization" in different threads from different instance of a class

本文关键字:visualization pcl 线程 实例      更新时间:2023-10-16

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

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我认为这是因为使用了线程。但是线程在我的项目中是必需的。

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

附言我正在使用 PCL 1.7

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

我关注 pcl::visual::P CLVisualizer 和"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 开发人员解决:)