0

qtwayland コンポジター テストで奇妙な問題が発生しました。qt c++ クライアントでのみ機能するようです。Qml クライアントがデッドロックで終了し、イベント処理が停止します (クライアントの場合)。このhttps://doc.qt.io/archives/qt-5.11/qtwaylandcompositor-qwindow-compositor-example.htmlの例を変更し、次の機能を追加しました。

void Compositor::onSurfaceCreated(QWaylandSurface *surface)
{
    connect(surface, &QWaylandSurface::subsurfacePositionChanged, this, &WaylandInterface::onSubsurfacePositionChanged);
    QQuickWindow *window = new QQuickWindow();
    window->resize( 400, 400);
    window->setVisible(true);
    QWaylandOutput* output = new QWaylandOutput( this, window );

    QCoreApplication::processEvents();
    View *view = new View(this);
    view->setSurface(surface);
    view->setOutput(output);
    view->m_window = window;
    m_views << view;

    connect(surface, &QWaylandSurface::surfaceDestroyed, view, [view] {
        view->m_window->requestUpdate();
    } );

    connect(surface, &QWaylandSurface::hasContentChanged, this, &WaylandInterface::surfaceHasContentChanged);
    connect(surface, &QWaylandSurface::hasContentChanged, view, [view] {
        view->m_window->requestUpdate();
    } );
    connect(surface, &QWaylandSurface::redraw, view, [view] {
        view->m_window->requestUpdate();
    } );


    QWaylandQuickItem * surfacItem = new QWaylandQuickItem( view->m_window->contentItem() );
    surfacItem->setSurface( surface );
    surfacItem->setOutput( view->output() );
    surfacItem->setPaintEnabled(true);
    surfacItem->setInputEventsEnabled(true);
    connect(surface, &QWaylandSurface::offsetForNextFrame, view, &View::onOffsetForNextFrame);
    connect(view, &QWaylandView::surfaceDestroyed, this, &WaylandInterface::viewSurfaceDestroyed);
}

c++ クライアントの場合、ウィンドウを作成してクライアントを埋め込みますが、qml クライアントは応答しません。ウィンドウ、出力、QuickItem の作成順序は正しいですか? 私は何かが恋しいですか?

ありがとう、ケイン

4

1 に答える 1

0

c++ クライアントはシングル スレッド レンダリングを使用していましたが、qml クライアントはレンダリング スレッドを使用していました。公開イベントがレンダラーに送信されると、出力がミューテックスを解放するように命令されない限り、qtwayland はそれをブロックします。レンダラーがフレームバッファをロックしている間、レンダラーはサーバーを待機しており、メイン スレッドはレンダー スレッドを待機しています => デッドロック。

コールバックは output->frameStarted(); 経由で送信できます。// 出力をレンダリングする前に->sendFrameCallbacks(); // レンダリング後

于 2019-12-20T07:34:03.300 に答える