我们有一个使用VTK 6.1的基于WinForms c ++ / cli CAD的应用程序。应用程序的一个功能是播放一个脚本,该脚本播放用户以前交互式完成的操作。我们在脚本播放时弹出模态进度表单,并在后台线程中执行脚本的非ui工作。后台线程的部分工作是创建和删除vtkPolyDataMappers。当后台线程正在进行并且进度表格显示时,我们需要通过调用vtkWin32RenderWindowInteractor :: Render()来更新主线程中的显示。
我们有一个定时器设置,因此在UserControl :: OnPaint事件处理程序中,每隔几百毫秒最多调用一次Render。这允许视图在脚本播放时更新,从而提供用户反馈。
这曾经在VTK 5中工作。但是现在在后台线程中删除vtkPolyDataMapper时会发生无限循环。无限循环在vtkClearOpenGLErrors中:
void vtkClearOpenGLErrors()
{
while (glGetError()!=GL_NO_ERROR){;}
}
vtkpolydatamapper内部是vtkOpenGLDisplayListPainter。当这被vtkGarbageCollectorImpl :: CollectInternal删除时,我们陷入了vtkClearOpenGLErrors。
有没有人有VTK和线程的经验可以帮助?你对此有所了解吗?这只是VTK 6.1中的一个明显问题。当后台线程在vtkPolyDataMapper上执行删除时,让主线程UI线程在vtkWin32RenderWindowInteractor上调用Render是不合法的吗?这不是一个时间问题。我认为这可能是一个OpenGL上下文问题,但不知道如何解决它。如果我们避免在后台线程进行时在显示器上调用Render但问题确实消失了,但我们想在脚本播放时给予用户反馈。
答案 0 :(得分:0)
我们通过使用
重新编译VTK来解决问题VTK_REPORT_OPENGL_ERRORS
关掉了。