gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:26:08 25 4
gpt4 key购买 nike

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

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::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 开发人员解决:)

关于c++ - 在类的不同实例的不同线程中使用 "pcl::visualization",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21155658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com