【问题标题】:PCL viewer->spinOnce() makes QT application quitPCL viewer->spinOnce() 使 QT 应用程序退出
【发布时间】:2015-02-15 03:54:31
【问题描述】:

我有一个 QT C++ 应用程序,它调用一个非 QT 函数,该函数运行基于此示例 http://pointclouds.org/documentation/tutorials/interactive_icp.php 的 PCL 代码。一切正常,但是当 PCL 代码完成时(PCLVisualizer 关闭并返回 QT 代码),QT 应用程序会自动退出。

我检查了导致此错误的指令,结果是对PCLVisualizer::spineOnce() 的调用。如果我评论这一行,PCL 可视化器不会正确显示,但点云操作运行正常,并且当计算完成时 QT 不会崩溃。

我想知道为什么对PCLVisualizer::spineOnce() 的调用会导致这种行为?如果我在 PCL 代码中调用此类函数,为什么我的 QT 应用程序会崩溃?

这是从 QT SLOT 函数调用 PCL 函数

void face_processing_GUI::runAlignment()
{
    icp::run_icp(target, source);
}

而 PCL icp::run_icp(string, string) 函数可以这么简单

int icp::run_icp(std::string in_target, std::string in_source)
{
    pcl::visualization::PCLVisualizer  * viewer = new  pcl::visualization::PCLVisualizer("ICP stage");
    viewer->spinOnce(); // If I comment this time it does NOT crash
    viewer->close();
    delete viewer;
}

【问题讨论】:

  • 它退出和/或崩溃了吗?如果是崩溃,回溯说什么?
  • 我不认为是崩溃,调试模式的输出在这里pastebin.com/9JkcuaTU

标签: qt point-cloud-library


【解决方案1】:

问题可能是viewer->spinOnce() 之后的viewer->close() 我不认为它应该那样运行,spinOnce() 方法应该循环运行;否则你应该使用spin()。你能试试这个吗?我没有足够的声望来发表评论。

//Main loop
while ( !viewer->wasStopped())
{
    viewer->spinOnce(100);
    // Comment this line if you don't use another thread to run the visualizer.
    boost::this_thread::sleep (boost::posix_time::microseconds (100000)); 
}

如果您使用来自 boost 库的共享指针创建查看器也可能会更好

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));

【讨论】:

  • 我会试试的,谢谢。但是,如何在不使用close() 的情况下自动关闭PCLVisualizer?我有兴趣向查看器显示固定次数的迭代,然后将其关闭。如何自动触发 wasStopped() 所需的内容?我相信wasStopped() 会查找诸如“q”键或 Esc 按下之类的事件?
  • @Dan 当你手动停止它时它工作吗?您可以使用 viewer->spin();查看器->关闭();
  • 抱歉回复晚了!您的建议并没有改变任何东西,当我使用viewer-&gt;spinOnce(100) 时它仍然崩溃。 QT 不会崩溃的唯一方法是如果我注释掉这一行,但是查看器是无用的:(
猜你喜欢
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 2019-01-19
相关资源
最近更新 更多