我有一个Qt前端应用程序,它连接到另一台机器中的端服务器。它不断发送心跳信息,告知自己还活着。
问题是当显示QMessageBox(使用QMessageBox::warning(...)
)时,它会挂起父应用程序,导致错过发送心跳最终导致由于心跳未命中计数超过而断开连接。
要求是,如果显示错误消息,则不允许用户与其他窗口交互。
做这件事最有效、最方便的方法是什么?
如果你在主线程中发送消息并做一些后台工作,你可以得到一些窗口"冻结"。最好在另一个线程中完成所有的后台工作。
如果发送消息都是在后台进行的,那么使用定时器可能就足够了,因为QNetworkAccessManager
是异步进行的,而不会阻塞当前线程。
QNetworkAccessManager有一个异步API。当调用上面的replyFinished插槽时,它采用的参数是QNetworkReply对象,该对象包含下载的数据以及元数据(标头等)。
不要使用QMessageBox::warning()
,而是创建QMessageBox
的实例并使用::open()
方法显示它。与::warning()
不同,此函数不会阻止您的应用程序。
请确保QMessageBox的父级设置为您的窗口,否则它不会阻止用户与窗口的交互。