сигнал предшествующего начала цикла событий QThread потерян - PullRequest
1 голос
/ 09 марта 2012

У меня есть случай, когда сигнал теряется, и я не понимаю, почему - обычно сигналы, отправленные до начала цикла обработки событий, просто ставятся в очередь и затем отправляются.

Вот как выглядит код (для объекта QThread):

void OffloadHandler::run()
{
    cout << "Start" << endl;
    connect( this, SIGNAL(loopStarted()), SLOT(onLoopStarted()), Qt::QueuedConnection );
    emit loopStarted();
    exec();
}

void OffloadHandler::onLoopStarted()
{
    cout << "Here!" << endl;
}

Поток запускается в другом месте и Start записывается в консоль, но Here1 никогда не бывает -- сигнал не получен.Я использую тот же шаблон в моем основном цикле сообщений, и он работает, но в этом цикле сообщений он не работает.

Что-то явно не так в моем коде здесь?

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Ваш код действителен, и он должен работать.Вы уверены, что в потоке, в котором создается oh, запущен цикл событий?

Потому что emit loopStarted() должен отправить событие в цикл событий oh, который будет обработан иЗвоните onLoopStarted().Я проверил ваш код, и он работает для меня.


Кстати, как правило, рекомендуется не добавлять слоты в QThread и избегать использования moveToThread( this );

К сожалению, я не совсем понимаю ваш вариант использования, поэтому не могу дать лучшего решения.Но здесь - это удивительная документация, в которой есть хорошие DO и DONT относительно QThread s.

0 голосов
/ 09 марта 2012

Хорошо, я понял это, меня укусила странность владения QThread. При подключении к самому объекту QThread нужно быть очень осторожным, поскольку этот объект по умолчанию не принадлежит потоку.

Итак, в точке, где создается нить, я должен переместить нить в нить:

OffloadHandler * oh = new OffloadHandler();
oh->moveToThread( oh ); //MOVE TO SELF!
oh->start();

Как только я это сделаю, сигналы будут работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...