我想要一个在云点上包含可视化工具的类。 这是我的代码:
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
答案 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开发人员解决:)