为什么删除vtkpolydatamapper会导致vtkcleaopenglers中出现无限循环



我们有一个基于WinForms c++/cli CAD的应用程序,它使用VTK 6.1。该应用程序的功能之一是播放一个脚本,该脚本以交互方式回放用户以前执行的操作。我们在脚本播放时弹出一个模态进度表,并在后台线程中完成脚本的非ui工作。后台线程的部分工作是创建和删除vtkPolyDataMappers。当后台线程正在进行并且进度表正在显示时,我们需要通过调用vtkWin32RenderWindowInteractior::Render()来更新主线程中的显示。

我们有一个计时器设置,因此在UserControl::OnPaint事件处理程序中,Render最多每隔几百毫秒调用一次。这允许在脚本播放时更新视图,并向用户提供反馈。

这曾经在VTK5中工作。但现在,在后台线程中删除vtkPolyDataMapper时,会发生一个无限循环。无限循环在vtkClearOpenGLErrors:中

void vtkClearOpenGLErrors()
{
 while (glGetError()!=GL_NO_ERROR){;}
}

vtkpolydatamapper内部是一个vtkOpenGLDisplayListPainter。当这被vtkGarbageCollectorImpl::CollectInternal删除时,我们会陷入vtkClearOpenGLErrors。

有人有VTK和线程的经验吗?你知道这件事吗?这只是VTK6.1中的一个明显问题。当后台线程在vtkPolyDataMapper上进行删除时,让主UI线程在vtkWin32RenderWindowInteractior上调用Render是否违法?这不是时间问题。我认为这可能是OpenGL上下文问题,但不确定如何解决。如果我们避免在后台线程运行时在显示器上调用Render,但我们希望在脚本播放时向用户提供反馈,那么问题就会消失。

我们通过使用重新编译VTK解决了这个问题

VTK_REPORT_OPENGL_ERRORS

关闭。

相关内容

  • 没有找到相关文章

最新更新