使用VTK和QT多线程时访问冲突异常
access violation exception when use VTK and QT multi-thread
我在主窗口中使用QVtkWidget
。我在一个新线程中生成一个vtkRenderer
,当它完成时,我发送一个signal
,它连接主窗口的slot
,将渲染器发送回来并更新QVtkWidget。
不幸的是,当我将渲染器添加到vtkRenderWindow时,我得到了一个"访问违反"异常。下面是我的代码:
threadobject.h
class ThreadObject : public QObject
{
Q_OBJECT
public:
ThreadObject();
~ThreadObject();
signals:
void startShowPointSignal(QString filepath);
void endShowPointSignal(vtkRenderer* render);
public slots:
void showPoint(QString filepath);
};
threadobject.cpp
#include "threadobject.h"
ThreadObject::ThreadObject(){}
ThreadObject::~ThreadObject(){}
void ThreadObject::showPoint(QString filepath)
{
//qDebug() << filepath << QThread::currentThreadId();
std::ifstream filestream(filepath.toLocal8Bit());
std::string line;
int pointCounts = 0;
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
colors->SetNumberOfComponents(3);
colors->SetName("Colors");
while (std::getline(filestream, line))
{
double x, y, z, r, g, b;
std::stringstream linestream;
linestream << line;
linestream >> x >> y >> z >> r >> g >> b;
points->InsertNextPoint(x, y, z);
colors->InsertNextTuple3(r, g, b);
}
filestream.close();
// Add the grid points to a polydata object
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(points);
polydata->GetPointData()->SetScalars(colors);
vtkSmartPointer<vtkVertexGlyphFilter> glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
glyphFilter->SetInputData(polydata);
glyphFilter->Update();
vtkSmartPointer<vtkCleanPolyData> cleaner = vtkSmartPointer<vtkCleanPolyData>::New();
cleaner->SetInputConnection(glyphFilter->GetOutputPort());
cleaner->Update();
// Create a mapper and actor
vtkSmartPointer<vtkPolyDataMapper> pointMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
pointMapper->SetInputConnection(cleaner->GetOutputPort());
vtkSmartPointer<vtkActor> pointActor = vtkSmartPointer<vtkActor>::New();
pointActor->SetMapper(pointMapper);
// Create a renderer
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
// Add the actor to the scene
renderer->AddActor(pointActor);
renderer->ResetCamera();
renderer->SetBackground(0.1, 0.1, 0.1);
//send the renderer back to my qt window
emit endShowPointSignal(renderer);
//delete this;
}
mainwindow.cpp
void MainWindow::test()
{
QThread* thr1 = new QThread();
ThreadObject* obj = new ThreadObject();
obj->moveToThread(thr1);
connect(obj, SIGNAL(startShowPointSignal(QString)), obj, SLOT(showPoint(QString)), Qt::QueuedConnection);
connect(obj, SIGNAL(endShowPointSignal(vtkRenderer*)), this, SLOT(updateVTK(vtkRenderer*)), Qt::QueuedConnection);
thr1->start();
obj->startShowPointSignal("D:/WorkSpace/VS Project/Plane/Datas/1.xyz");
}
void MainWindow::updateVTK(vtkRenderer* renderer)
{
double test[3];
renderer->GetBackground(test);
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer); // I GOT THE ACCESS VIOLATION THIS LINE!!!!!
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleTrackballCamera> istyle = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderWindowInteractor->SetInteractorStyle(istyle);
renderWindowInteractor->SetRenderWindow(renderWindow);
ui.qvtkWidget->SetRenderWindow(renderWindow);
renderWindow->Render();
renderWindowInteractor->Start();
}
我试过把所有的代码放在主窗口,而不是使用一个新的线程,它工作得很有趣。
所以有什么问题,当我使用QT线程?还是有什么我没注意到的?
我是QT的新手,QT和VTK的版本是5.7和7。
好的,最后我发现这是一个非常愚蠢的问题。我使用vtkSmartPointer
创建了渲染器,但信号和插槽的参数是常规指针。修改参数为vtkSmartPointer格式后,问题消失。
相关文章:
- 写入访问冲突异常
- 在C++中删除双向链表的头节点后出现访问冲突异常
- Visual Studio图形调试器引发读取访问冲突异常
- 尝试将 std::cerr 重定向到文件时出现访问冲突异常
- 媒体基础:读取示例 - 访问冲突异常
- 链表的访问冲突异常
- 进入函数之前的访问冲突异常
- 删除函数 c++ 的读取访问冲突异常
- 无法使用 C++ catch(..) 捕获访问冲突异常
- 在Visual Studio Community中使用glfw3 glew和opengl获取访问冲突异常
- 访问动态 2D 字符数组时引发访问冲突异常
- 从静态库使用 Boost Asio 时访问冲突异常
- 为什么访问冲突异常不能被 捕获.NET4.0.
- glGenBuffers 访问冲突异常
- unsigned char*导致访问冲突异常
- 注入DLL的函数中出现访问冲突异常(5)
- 删除二叉搜索树中的节点中的 Visual Studio 中的访问冲突异常
- 提升 Asio tcp::接受者访问冲突异常
- 在 .Net 应用程序中调用 C++ DLL 时出现系统访问冲突异常
- 为什么此代码会引发访问冲突异常