我是Qt的新人,虽然我用C ++写了很多年只用了大约一年左右的时间。我们正在编写一个相机应用程序,它有一些用于访问帧缓冲区,视频等的C ++代码和一个用QML编写的GUI。有必要在c ++类中调用gstreamer,它需要在一个单独的线程中运行,并且需要从QML代码中调用(因为如果在启动QML之前调用它,QML代码会挂起等待线程完成)。 p>
我发现在回答其他人的问题时,这是一个很好的方式:How Start a Qthread from qml?。不幸的是,当我试图修改我的代码以运行时,如其中一个答案所示,我得到一个SIGABT信号。当代码执行以下行时会发生这种情况:
view.engine()->rootContext()->setContextProperty("thread", &gstworker);
main.cpp函数如下所示:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQmlContext>
#include <gst/gst.h>
#include "common.h"
#include "fbctl.h"
#include "gstcameraif.h"
#include "gstworker.h"
int main(int argc, char *argv[])
{
DBG_PRINT("main.cpp: register FbCtl type\n");
qmlRegisterType<FbCtl>("test.fbctl.qt", 1, 0, "FbCtl");
DBG_PRINT("main.cpp: register GstCameraIf type\n");
qmlRegisterType<GstCameraIf>("test.gstcameraif.qt", 1, 0, "GstCameraIf");
DBG_PRINT("main.cpp: register GstWorker type");
qmlRegisterType<GstWorker>("test.gstworker.qt", 1, 0, "GstWorker");
gst_init(&argc, &argv);
GstCameraIf gStreamer;
FbCtl fbSetup; // get a local instance of the frame buffer control object
fbSetup.setupOverlay(); // initialize the overlay setup
fbSetup.stopProcess(); // close opened descriptors, unmap frame buffers
qputenv("QT_QPA_EGLFS_FB", "dev/fb1"); // redirects QT to use fb1 (overlay) and gstreamer will go to fb0
GstWorker gstworker;
QQuickView view;
view.engine()->rootContext()->setContextProperty("thread", &gstworker);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
gst_deinit();
return app.exec();
}
函数调用列表(堆栈)显示以下跟踪:
1 __GI_raise raise.c 54 0xb5ae1910
2 __GI_abort abort.c 89 0xb5ae2ca0
3 qt_message_fatal qlogging.cpp 1687 0xb5e0fff8
4 QMessageLogger::fatal qlogging.cpp 795 0xb5e0fff8
5 qt_pixmap_thread_test qpixmap.cpp 74 0xb670ce98
6 QPixmap::QPixmap qpixmap.cpp 109 0xb670ce98
7 QCursorData::QCursorData qcursor.cpp 624 0xb66a3360
8 QCursorData::initialize qcursor.cpp 655 0xb66a3360
9 QCursor::QCursor qcursor.cpp 470 0xb66a3360
10 QWindowPrivate::QWindowPrivate qwindow_p.h 107 0xb6bb3a78
11 QQuickWindowPrivate::QQuickWindowPrivate qquickwindow.cpp 501 0xb6bb3a78
12 QQuickViewPrivate::QQuickViewPrivate qquickview.cpp 77 0xb6c306e0
13 QQuickView::QQuickView qquickview.cpp 166 0xb6c30778
14 main main.cpp 38 0x131c8
我的问题是我需要解决什么才能摆脱sigabt信号 感谢您提供的任何帮助。
答案 0 :(得分:0)
当我再次遇到错误时,我注意到在声明QQuickView
对象时实际上正在发生此错误。我将main.cpp
更改为使用QQmlApplicationEngine
(而不是创建快速查看引擎)来设置上下文,并且错误不再发生。
仅供参考:SIGABT错误在消息框中给出,仅此而已。
我想感谢@ m7913d为解决此问题提供的帮助。