может ли Qt сигнализировать о спящем потоке - PullRequest
0 голосов
/ 24 мая 2019

Я работаю над некоторым приложением, использующим каркас Qt, оно использует последовательный порт и нуждается в получении некоторых данных, проблема в том, что данные организованы по некоторому протоколу, который я анализирую в обработчике сигналов (слоте) readyRead () на В то же время, мне нужно подождать, пока не будет обработано сообщение с некоторым таймаутом. Итак, чтобы подождать, я использую QThread :: msleep () после отправки, но я заметил, что когда поток переходит в режим сна в msleep (), readyRead будет генерироваться только после завершения msleep (). У меня вопрос, почему readyRead не может проснуться? Сигнал Qt не работает как реальные сигналы Unix?

1 Ответ

1 голос
/ 24 мая 2019

Если у вас однопоточное приложение, readyRead слот не выполняется сразу, вы получили данные по порту.Читайте о Qt::QueuedConnection в QObject::connect().Когда сигнал readyRead излучается в классе последовательного порта, он просто добавляется в очередь событий (в глобальном цикле событий).Все события будут выполнены позже QEventLoop (внутри экземпляра QApplication).

Похоже, что вы спите свой основной поток, поэтому QEventLoop не может выполнить что-либо во время сна.В этом случае вам нужно прочитать ваш порт из другого потока, чтобы избежать спящего режима основного потока.

...