Как отладить потерянные события, опубликованные в потоке без GUI в Qt? - PullRequest
1 голос
/ 02 мая 2010

Как говорит субъект, я публикую события из не-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 (это, кстати, Qt 4.6.2 в Windows) - все вроде бы нормально.

Объект, на который указывает data, живет в потоке GUI, я дважды проверил это.

Как я могу отладить эту проблему? Или, может быть, лучше вообще обойти это?

1 Ответ

1 голос
/ 03 мая 2010

0h Боже мой.

Я , поэтому глуп.

Я провел буквально дней отладки этого.

И проблема выглядела так:

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

    // ...
}

Да, я переопределил QObject::event() (чтобы добавить специальную обработку событий show / hide и resize), и не вызывал базовый метод . И, угадайте, что, Qt::QueuedConnection использует QEvent s для выполнения отложенных вызовов.

Никогда не делай так, как я. Действительно.

Или, дорогой Qt, не могли бы вы использовать NVI , чтобы защитить нас от подобных ошибок?

...