c++ 点云库(PCL)过滤超时

myzjeezk  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(110)

我有一个函数,应该在一个受控的时间内运行。但是这个函数使用了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
)

通常,这个函数执行得很快,但并不总是如此,我并不需要所有的响应(这取决于函数的采样输入)。所以我想做的是,如果函数的超时时间超过了给定的超时时间,它会被安全地取消,这样我就可以用其他样本启动一个新的线程。
安全取消的意思是避免内存泄漏或僵尸线程。

7vhp5slm

7vhp5slm1#

#include <future>
#include <chrono>

void cloud_filtering(pcl::PointCloud<pcl::PointXYZRGB>::SharedPtr pcl_unfilt, pcl::PointCloud<pcl::PointXYZRGB>::SharedPtr pcl_filt, std::promise<void>&& promise) 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

    promise.set_value(); // signal completion
}

// function to call with a timeout
bool cloud_filtering_with_timeout(pcl::PointCloud<pcl::PointXYZRGB>::SharedPtr pcl_unfilt, pcl::PointCloud<pcl::PointXYZRGB>::SharedPtr pcl_filt, int timeout_ms) {
    std::promise<void> promise;
    auto future = promise.get_future();
    auto task = std::async(std::launch::async, &cloud_filtering, this, pcl_unfilt, pcl_filt, std::move(promise));
    bool completed = false;
    if (future.wait_for(std::chrono::milliseconds(timeout_ms)) == std::future_status::timeout) {
        // timeout occurred, cancel task
        task.get(); // this will call std::terminate() if the task is still running
        completed = false;
    } else {
        completed = true;
    }
    return completed;
}
  • cloud_filtering_with_timeout接受输入点云+超时(以毫秒为单位)--返回布尔值(函数是否在超时前完成)

std::promise发出cloud_filtering完成的信号--std::future等待超时完成(超时发生在函数完成之前--task.get()调用将取消任务-抛出std::future_error--将被std::async捕获+忽略)
PS.不是取消pcl::StatisticalOutlierRemoval的干净方法,但应该可以避免内存泄漏和僵尸线程

相关问题