使用QT和QOGL的多线程崩溃

时间:2012-07-21 15:30:14

标签: c++ multithreading qt debugging opencv

我有一个QOGLWidget小部件,它构建在另一个窗口中,该窗口由QMainwindow中的按钮激活。 我正在尝试将一个图像的表面从窗口小部件发送到主窗口的QOGLWidget,它崩溃的问题并给出了第一次机会异常访问冲突。

1 个答案:

答案 0 :(得分:1)

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

Qt的::自动连接

您的帧生成器和GUI(SimulatorWindow + GLSimulatorWidget)之间的连接由Qt::AutoConnection连接,当它们驻留在不同的线程上时最终变为Qt::DirectConnection。指定Qt::QueuedConnection的连接以克服此问题(如果确实它们位于不同的线程上)。

QPixmap v.QImage

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

堆栈初始化

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

...然后当您离开本地范围以在GUI中表示对象时,您的框架对象将消失,您的处理程序/容器将保留一个错误的指针。

要解决此问题,请初始化到堆上并坚持Qt Object Model。另外,我喜欢将堆上的容器也作为它们所属类的成员变量。

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