显示MessageBox时,父窗口操作已挂起
Parent window actions suspended when a MessageBox is shown
我有一个Qt前端应用程序,它连接到另一台机器中的端服务器。它不断发送心跳信息,告知自己还活着。
问题是当显示QMessageBox(使用QMessageBox::warning(...)
)时,它会挂起父应用程序,导致错过发送心跳最终导致由于心跳未命中计数超过而断开连接。
要求是,如果显示错误消息,则不允许用户与其他窗口交互。
做这件事最有效、最方便的方法是什么?
如果你在主线程中发送消息并做一些后台工作,你可以得到一些窗口"冻结"。最好在另一个线程中完成所有的后台工作。
如果发送消息都是在后台进行的,那么使用定时器可能就足够了,因为QNetworkAccessManager
是异步进行的,而不会阻塞当前线程。
QNetworkAccessManager有一个异步API。当调用上面的replyFinished插槽时,它采用的参数是QNetworkReply对象,该对象包含下载的数据以及元数据(标头等)。
不要使用QMessageBox::warning()
,而是创建QMessageBox
的实例并使用::open()
方法显示它。与::warning()
不同,此函数不会阻止您的应用程序。
请确保QMessageBox的父级设置为您的窗口,否则它不会阻止用户与窗口的交互。
相关文章:
- 挂起和取消挂起一个文件DLL
- 如何防止C++遗留代码中的挂起指针
- 为什么所有C++编译器都会崩溃或挂起此代码
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 构建挂起,即使是适度的文件大小
- 循环挂起迭代的 std::擦除 on std::list
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 从不同进程中的另一个线程挂起/恢复线程或进程
- Boost (Beast) websocket:同步写入挂起
- 为什么析构函数挂起
- 使用互斥会挂起程序
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- closesocket()未完成IOCP的挂起操作
- QMutex是否需要是静态的,以便该类实例的其他线程调用知道要挂起它们的操作
- 显示MessageBox时,父窗口操作已挂起
- 如果 ssl::stream<tcp::socket 有挂起的操作,我是否不允许删除它>?
- 阻止取消Boost.Asio中挂起的异步操作
- 带有互锁操作的线程同步在Visual Studio 2013 c++原生代码中挂起
- WriteFile成功,即使缓冲区被挂起的操作覆盖