使用QT和QOGL的多线程崩溃

Multithreading Crash using QT and QOGL

本文关键字:多线程 崩溃 QOGL QT 使用      更新时间:2023-10-16

我有一个QOGLWidget小部件,它是在另一个窗口中构建的,由QMainwindow中的按钮激活。我正试图将图像的表面从小部件发送到主窗口的QOGLWidget,问题是它崩溃了,并首次出现异常访问违规。

我认为在这种情况下可能会发生三件事:

问题::自动连接

帧生成器和GUI(SimulatorWindow+GLSimulatorWidget)之间的连接由Qt::AutoConnection连接,当它们位于单独的线程上时,最终会变成Qt::DirectConnection。指定Qt::QueuedConnection的连接以解决此问题(如果它们确实在单独的线程上)。

QPixmap诉QImage

您可以在GUI线程之外处理QPixmaps。这通常会打印出警告,但可能仍然有效。通常,如果您处理一个不在GUI线程中的图像,然后将其发送到GUI线程,则需要使用QPixmap之外的东西,如QImage。

堆栈上的初始化

当框架对象到达GUI时,它可能已经超出了范围。例如,如果您构建一个框架,并将其存储在堆栈的本地作用域中,然后将其传递到处理程序或容器中。。。

然后,当您将本地作用域留给在GUI中表示对象时,您的框架对象将消失,并且您的处理程序/容器将保留一个错误的指针。

要解决此问题,请在堆上初始化并坚持使用Qt对象模型。此外,我喜欢让堆上的容器也作为它们所属类的成员变量

综上所述:检查你的连接类型,如果你的帧生成器是否在GUI线程上,如果你在一个不是GUI的线程中,请使用QImage而不是QPixmap,并确保你的指针没有超出范围。