OK, ho preso a lavorare ora, forse ho fatto qualcosa di sbagliato prima, ecco come ho fatto con le discussioni Boost e 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:
Secondo t il suo page Il motivo è che l'aggiunta di una nuvola di punti vuota al visualizzatore fa impazzire le cose quindi ho modificato il codice sopra
Ciao @khaled!. Quindi, il viusalizer è in esecuzione in un thread diverso e funziona bene ?. Nel documento Doxy di PCLVisualizer ho trovato questo: 'Questa classe NON può essere utilizzata su più thread. Chiama solo le funzioni degli oggetti di questa classe dallo stesso thread in cui sono stati creati! Alcuni metodi, ad es. addPointCloud, si bloccherà se chiamato da altri thread'. Sono davvero interessato ad avere il visualizzatore in esecuzione in un altro thread, quindi per favore. Potresti confermare che il tuo approccio funziona? : D –
sì, questo funziona davvero. i documenti sono ancora corretti, dovresti chiamare metodi come 'addPointCloud' solo dal thread della visualizzazione non da un altro thread. Quindi non puoi chiamare 'addPointCloud' dal metodo principale se il tuo ciclo di visualizzazione è in un thread diverso. – Khaled
Grazie !. Ci proverò subito !. –