gpt4 book ai didi

c++ - 使用VTK和QT多线程时访​​问冲突异常

转载 作者:行者123 更新时间:2023-11-28 05:29:56 25 4
gpt4 key购买 nike

我在我的主窗口中使用了一个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++ - 使用VTK和QT多线程时访​​问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39771265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com