vtkRenderWindowInteractor事件循环和线程

时间:2015-07-01 10:06:00

标签: c++ multithreading qt vtk

我在使用vtk进行交互和渲染的应用程序中尝试做的是有两个不同的部分: 1 - 具有Rendering和vtkRenderWindowInteractor的线程,用于与鼠标交互。 2 - 调用VTK线程中定义的数据的某些修饰函数的线程。

从我迄今为止在我的研究中得到的结果看起来相当复杂,VTK不是线程安全的。现在,我在VTK邮件列表上偶然发现了这篇帖子(http://vtk.1045678.n5.nabble.com/Multi-threaded-VTK-td4514620.html),建议使用Qt信号和插槽。第一个问题是,仍然是一个好的解决方案吗?

与此相关的第二个问题以及我之前遇到的问题是start()的{​​{1}}正在阻止。到目前为止,无论我尝试过什么,只要调用start()方法(因为我进入渲染循环),所有通过旋转或平移或缩放功能完成的修改都不会完成。 那么我的问题是:如果我使用Qt Signals和Slots会阻止我解决这个问题吗?

这是我到目前为止渲染和推出vtkRenderWindowInteractor的基本代码:

vtkRenderWindowInteractor

所以我可以通过询问来总结一下:在使用std::string filename = BUNNY; // Read all the data from the file vtkSmartPointer<vtkXMLPolyDataReader> reader =vtkSmartPointer<vtkXMLPolyDataReader>::New(); reader->SetFileName(filename.c_str()); reader->Update(); inputPolyData = reader->GetOutput(); cout << "File Found and Loaded : " << filename << endl ; vtkSmartPointer<vtkTransform> translation = vtkSmartPointer<vtkTransform>::New(); translation->Translate(0.3, -0.05, 0); transformFilter = vtkSmartPointer<vtkTransformPolyDataFilter>::New(); //transformFilter->SetInputConnection(reader->GetOutputPort()); transformFilter->SetInputData(inputPolyData); transformFilter->SetTransform(translation); //transformFilter->Update(); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(transformFilter->GetOutputPort()); mainActor = vtkSmartPointer<vtkActor>::New(); mainActor->SetMapper(mapper); ren->AddActor(mainActor); vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); iren->SetRenderWindow(win); vtkInteractorStyleMultiTouchCamera *style = vtkInteractorStyleMultiTouchCamera::New(); iren->SetInteractorStyle(style); //Start the event loop iren->Initialize(); iren->Start(); //defineClipping(); win->PolygonSmoothingOn(); win->Render(); win->Start(); ctxView->Render(); 的{​​{1}}阻止start()方法运行vtk的渲染和交互线程时,Qt是否允许我必须调用转换函数?如果不是,我应该更改我的代码并考虑在VTK中与我的对象进行交互的不同可能性吗?

1 个答案:

答案 0 :(得分:5)

我在调用start()之后能够进行轮换,但在我的情况下来自同一个帖子。

诀窍是使用vtkCommand并在vtkRenderWindowInteractor中设置一个计时器来调用该命令。该命令基本上是一个能够修改你的演员的回调。

您可以在this thread中找到相关的实例。

关于您正在使用的多线程方法,也许您可​​以让渲染线程在vtkCommand::Execute中等待,直到修改线程完成为止。如果您能够使用C ++ 11,则可以使用STL中提供的许多新工具。