在等待QTcpSocket数据时阻塞GUI
Block GUI when waiting for QTcpSocket data
我正在编写一个程序,使用Qt与基于网络的API进行交互。与API的交互使用XML消息(查询和结果)
我在一个共享库项目中的一个类中实现了通信和数据处理,我有一个QMainWindow,用户可以在其中输入连接细节。当点击连接按钮时,会发生以下情况:1. 将创建连接类的一个实例。2. 将连接消息发送到API以获取会话ID。解析答案,并将会话ID存储在类实例中。3.消息被发送到API以获取一些字段信息。然后解析XML以提取所需的字段信息,从而从API获取数据。4. 发送另一条消息以获取与字段匹配的数据。然后解析XML答案并将其存储在一个数据结构中以供处理。5. 然后对数据进行处理并最终显示给用户。
我做了一个简单的控制台程序来测试库,它工作得很好-在处理前一个消息的所有数据之前没有发送消息。然而,当我在QMainWindow实例中实现相同的过程时,没有等待发生,消息一个接一个地发送,而不需要等待。
我如何阻止GUI线程在发送下一条消息之前等待完全处理?
谢谢
阻塞UI不是通过阻塞事件循环来实现的。这是通过禁用那些你不想与之交互的小部件来实现的——要么直接调用它们的disable()
方法,要么基于一些状态变量来保护交互,例如:
connect(button, &QPushButton::clicked, button, [this]{
if (! hasAllData) return;
// react to a button press
});
您所需要的只是定义一组应用程序可以处于的状态,并在适当的状态下禁用相关的小部件。我认为,一旦建立了会话,无论如何并行地发出所有查询是最快的,并且在回复实时返回时异步更新UI。
相关文章:
- C++GTKMM gui循环依赖关系
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 如何使用 QDatastream 通过 QTcpSocket 发送 QSqlQueryModel?
- 如何在带有 gdb GUI 前端的 ARM gdbserver 的 PC 上执行远程 gdb 会话?
- 在 Gui Win32 中创建子窗口C++
- QTcpSocket emulate netcat 'conversation'
- 如何防止 std::thread 在 QT 中冻结 GUI?
- 调试控制台 ChessEngine.exe "used"在另一个应用程序(国际象棋 GUI)中
- 更改 Windows GUI 中静态文本框的字体大小
- 我不知道如何使用代码块win32 gui
- Qt GUI使用Qfiledialogbox和qlabel显示视频,这是我的代码
- QtConcurrent - 在发布到 UI 线程的数千个结果中保持 GUI 响应
- QTcpSocket 在 RemoteHostClosedError 后重新连接到服务器时无法传输数据
- 德尔福在回调中出现 GUI 问题
- 从 GUI 文件资源管理器执行程序,并且不生成终端
- 线程和 GUI 处理
- QTcpServer/QTcpSocket:使用 QDataStream 与直接发送 UTF-8 数据
- 在等待QTcpSocket数据时阻塞GUI