использование pcl::visualization в разных потоках из разных экземпляров класса

Я хочу иметь класс, который содержит визуализатор точки облака. вот мой код:

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 ;
}

теперь у меня есть класс визуализаторов, которые можно создать в «основном». когда я сделал только один экземпляр из класса «my_vis», все в порядке, когда программа работает. Но мне нужно два или более экземпляров. и когда я инициализирую более одного экземпляра, возникает ошибка: BLOCK_TYPE_IS_VALID Я думаю, что это из-за использования потоков. Но потоки необходимы в моем проекте.

Не могли бы вы мне помочь? Большое спасибо за вашего пациента и помощь :)

P.S. Я использую PCL 1.7.


person elaheh r    schedule 16.01.2014    source источник
comment
Я тестирую общие указатели boost для класса визуализации, boost::shared_ptr‹pcl::visualization::PCLVisualizer› vis (new pcl::visualization::PCLVisualizer (window_name,false)); но ничего не изменилось.   -  person elaheh r    schedule 18.01.2014


Ответы (1)


Через два дня я наконец решаю это.

Я обращаю внимание на конструктор 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 :)

person elaheh r    schedule 21.01.2014
comment
при работе с огромными данными облака точек это решение ужасно! :) - person elaheh r; 22.01.2014
comment
Не могли бы вы предоставить весь написанный код? Я не понимаю, где заменить vis-›spinOnce(1). Спасибо, всем будет полезно - person SPS; 27.05.2016