我有一个函数,应该在一个受控的时间内运行。但是这个函数使用了pcl::StatisticalOutlierRemoval
,我没有找到任何合理的方法来取消这个函数,除了任意杀死线程。
我有这样的东西:
void cloud_filtering(pcl::PointCloud<pcl::PointXYZRGB>::SharedPtr pcl_unfilt, pcl::PointCloud<pcl::PointXYZRGB>::SharedPtr pcl_filt) const{
// do something
pcl::StatisticalOutlierRemoval<pcl::PointXYZRGB> sor;
sor.setInputCloud(*pcl_unfilt);
sor.setMeanK(50);
sor.setStddevMulThresh(1.0);
sor.filter(*pcl_filt);
// do something
}
这个函数由一个独立的线程执行,应该有一些超时。使用std::async启动线程,并使用返回的future检查完成。
auto future = std::async(
std::launch::async,
&cloud_filtering,this,pcl_unfilt,pcl_filt
)
通常,这个函数执行得很快,但并不总是如此,我并不需要所有的响应(这取决于函数的采样输入)。所以我想做的是,如果函数的超时时间超过了给定的超时时间,它会被安全地取消,这样我就可以用其他样本启动一个新的线程。
安全取消的意思是避免内存泄漏或僵尸线程。
1条答案
按热度按时间7vhp5slm1#
cloud_filtering_with_timeout
接受输入点云+超时(以毫秒为单位)--返回布尔值(函数是否在超时前完成)std::promise
发出cloud_filtering
完成的信号--std::future
等待超时完成(超时发生在函数完成之前--task.get()
调用将取消任务-抛出std::future_error
--将被std::async
捕获+忽略)PS.不是取消
pcl::StatisticalOutlierRemoval
的干净方法,但应该可以避免内存泄漏和僵尸线程