Действия родительского окна приостанавливаются, когда отображается MessageBox

У меня есть внешнее приложение Qt, которое подключается к внутреннему серверу на другом компьютере. И он продолжает посылать сообщения о сердцебиении, чтобы сообщить, что он жив.

Проблема заключается в том, что когда отображается QMessageBox (с использованием QMessageBox::warning(...)), он приостанавливает активность родительского приложения, что приводит к пропуску отправки сердечных сокращений, что в конечном итоге приводит к отключению из-за превышения количества пропущенных сердечных сокращений.

Требование состоит в том, чтобы запретить пользователю взаимодействовать с другими окнами, если отображается сообщение об ошибке.

Как это сделать наиболее эффективно и удобно?


person Praneeth Peiris    schedule 13.11.2015    source источник
comment
Как вы отправляете сердцебиение? Таймеры Qt обычно не приостанавливаются модальными окнами (хотя, как правило, обработка протокола связи выполняется в отдельном потоке именно для того, чтобы избежать подобных проблем).   -  person Matteo Italia    schedule 13.11.2015
comment
Вы можете создать собственный QThread для своих сообщений пульса, это будет работать независимо от каких-либо действий в основном потоке.   -  person Sebastian Lange    schedule 13.11.2015
comment
QMessageBox заставляет остальную часть GUI зависать до тех пор, пока окно сообщения не будет закрыто, если вы основываете хартбиты на других элементах GUI - возможно, это так, я бы рекомендовал вам использовать QTimer из потока без графического интерфейса с QThread::exec или проверьте QNetworAccessManager как предложено @0x35.   -  person Konrad 'Zegis'    schedule 13.11.2015


Ответы (2)


Если вы отправляете свои сообщения и выполняете некоторые фоновые действия в основном потоке, вы можете получить некоторое «зависание» окна. Все бэкграунды лучше делать в другой ветке.

Если отправка сообщений — это все, что вы делаете в фоновом режиме, может быть достаточно использовать таймеры, потому что QNetworkAccessManager делая это асинхронно, не блокируя текущий поток.

QNetworkAccessManager имеет асинхронный API. Когда вызывается описанный выше слот replyFinished, параметром, который он принимает, является объект QNetworkReply, содержащий загруженные данные, а также метаданные (заголовки и т. д.).

person 0x35    schedule 13.11.2015

Вместо использования QMessageBox::warning() создайте экземпляр QMessageBox и покажите его с помощью метода ::open(). В отличие от ::warning() эта функция не заблокирует ваше приложение.

Убедитесь, что родитель QMessageBox установлен как ваше окно, иначе это не помешает взаимодействию пользователя с окном.

person HeyYO    schedule 13.11.2015