2015-11-13 4 views
0

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

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

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

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

+3

Как вы посылаете сердечные сокращения? Таймеры Qt обычно не приостанавливаются модальными окнами (хотя, как правило, обработка протокола связи выполняется в отдельном потоке, чтобы избежать подобных проблем). –

+1

Вы можете создать собственный QThread для сообщений о сердцебиении, это будет работать независимо от любых действий в основном потоке. –

+1

'QMessageBox' заставляет остальную часть GUI замораживать до тех пор, пока окно сообщения не будет отклонено, если вы используете hartbeats для других элементов GUI - возможно, это так, я рекомендовал бы вам использовать [QTimer] (http://doc.qt.io /qt-4.8/qtimer.html#details) из потока non-gui с помощью [QThread :: exec] (http://doc.qt.io/qt-4.8/qthread.html#exec) или проверьте QNetworAccessManager как @ 0x35 предложил. –

ответ

1

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

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

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

1

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

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