1

件名が言うように、私は非 GUI スレッド (正確には GStreamer スレッド) からイベントを投稿しています。コードは次のようになります。

GstBusSyncReply on_bus_message(GstBus* bus, GstMessage* message, gpointer data)
{
    bool ret = QMetaObject::invokeMethod(static_cast<QObject*>(data), "stateChanged", Qt::QueuedConnection);
    Q_ASSERT(ret);

    return GST_BUS_PASS;
}

問題は、stateChanged(スロットかシグナルかは関係ありません) が呼び出されないことです。私はデバッガーに足を踏み入れQMetaObject::invokeMethod、それが呼び出されるまでそれに従いましたPostMessage(ちなみに、WindowsではQt 4.6.2です)-すべて問題ないようです。

が指すオブジェクトdataは GUI スレッドに存在します。これを再確認しました。

この問題をデバッグするにはどうすればよいですか? または、より良いのは、それを完全に回避することでしょうか?

4

1 に答える 1

1

なんてこった。

私はとても愚かです。

私はこれをデバッグするのに文字通り何日も費やしました。

そして、問題は次のようになりました。

bool VideoWidget::event(QEvent* e)
{
    if (!impl_)
        return false;

    // ...
}

はい、QObject::event()(show/hide および resize イベントの特別な処理を追加するために)再実装しましたが、基本メソッドは呼び出しませんでした。そして、何を推測すると、遅延呼び出しを行うために s をQt::QueuedConnection使用します。QEvent

私のようなことは絶対にしないでください。本当。

または、親愛なる Qt さん、NVIを使用して、この種の間違いから私たちを守っていただけませんか?

于 2010-05-03T13:31:26.370 に答える