OK, I got it to work now, maybe I did something wrong before, here is how I did it using boost threads and mutex
bool update;
boost::mutex updateModelMutex;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
void visualize()
{
// prepare visualizer named "viewer"
while (!viewer->wasStopped ())
{
viewer->spinOnce (100);
// Get lock on the boolean update and check if cloud was updated
boost::mutex::scoped_lock updateLock(updateModelMutex);
if(update)
{
if(!viewer->updatePointCloud(cloud, "sample cloud"))
viewer->addPointCloud(cloud, colorHandler, "sample cloud");
update = false;
}
updateLock.unlock();
}
}
int main()
{
//Start visualizer thread
boost::thread workerThread(visualize);
while(notFinishedProcessing)
{
boost::mutex::scoped_lock updateLock(updateModelMutex);
update = true;
// do processing on cloud
updateLock.unlock();
}
workerThread.join();
}
UPDATE:
According to this page The reason is that adding an empty point cloud to the visualizer causes things to go crazy so I edited the code above
This class can NOT be used across multiple threads. Only call functions of objects of this class from the same thread that they were created in! Some methods, e.g. addPointCloud, will crash if called from other threads
. I'm really interested in having the visualizer running in another thread, so please. Could you confirm that your approach is working?. :D – Mcmahan