使用 Qt 在 C++ 中进行线程串口通信

threaded serial port communication in C++ with Qt

我正在编写一个 QT 桌面应用程序,它将显示从串口接收到的信息。因此,使用标准 Windows API 功能创建了 class 并将其打包到 DLL 中以与连接的设备(CreateFile、ReadFile、WriteFile,...)进行通信。

目前,计时器以预定义的速率 [< 200ms] 调用 DLL,这会导致 gui 短时间冻结。因此我正在考虑使用一个线程来做串行端口的东西,这也将显示所有内容。

是使用线程解决这个问题更好还是我应该重写 class 来基于工作事件?目标是,gui 不会冻结。

编辑: 我使用 QThread derived worker class 解决了这个问题,它有一个被遮蔽的 运行() 函数,它在后台处理串行端口通信并在有新信息可用时更新 gui。

在许多用例中,最好在单独的线程上执行所有阻塞(同步)I/O,尤其是在涉及图形用户界面时。 Here's a page I've referenced 关于同步 I/O 的挑战(与您的代码不阻塞但仍然 single-threaded 的异步相反,或者如您所讨论的那样是并行的)。除了您提出的问题之外,还有更多问题,例如:

  • 没有数据怎么办?在有数据之前,GUI 是否会阻塞?例如,如果发件人已关闭,则不会有数据
  • 如果 I/O 设备不再可用,程序会做什么?例如,如果是 USB-to-serial 适配器,如果拔掉适配器会怎样?