gpt4 book ai didi

Qt 串口的 C++ 线程模式

转载 作者:搜寻专家 更新时间:2023-10-31 00:13:49 25 4
gpt4 key购买 nike

我的目标是在不阻塞主线程 (GUI) 的情况下从串行设备接收消息,并尝试将平台相关逻辑(GUI 和串行端口)与业务逻辑(处理消息)分开,以便于移植到其他平台

上下文:我正在使用 Qt 和 QtSerialPort 模块。消息协议(protocol)简单,0xff用于结束每条消息。

到目前为止我已经找到了 4 种解决方案:

方法一:

  1. 使用一个线程读取串口并填充缓冲区

  2. 使用另一个线程读取缓冲区,提取有效消息(到另一个缓冲区?不确定这将如何工作)

  3. 使用另一个线程来解析消息

方法二:

  1. 使用一个线程读取串口,并将有效消息提取到缓冲区

  2. 使用另一个线程解析消息

方法三:

  1. 使用一个线程读取串行端口,提取有效消息,并阻塞直到该消息被处理,利用 QtSerialPort 的内部读取缓冲区来缓冲传入数据

方法四:

  1. 使用主线程异步读取串口,提取有效消息,并为每条消息生成一个新线程来处理它们

方法 1、2 和 3 的区别在于将一般工作负载拆分成的线程数,但我不知道哪个最好。

我目前正在使用方法 4,该方法效率低得可怕,并且在低端计算机上效果不佳,因为产生了大量的线程,并且每次我移动或与 GUI 交互时,串行通信停止。为每条消息生成一个线程也会使消息的顺序不确定,到目前为止这还不是主要问题...

是否还有其他方法,每种方法的优缺点是什么(如果有的话),哪种方法最好用?谢谢!

编辑:在主线程中处理消息的一个问题是与 GUI 交互(甚至移动窗口)会阻塞消息处理功能。有什么办法解决这个问题吗?

最佳答案

我认为使用多线程可以获得两个主要优势:

  1. 避免因 GUI 处理例程被串行端口处理例程推迟而导致的 GUI 性能不佳
  2. (可能更重要)当 GUI 例程延迟串行数据读取例程太久时,避免缓冲区溢出导致串行数据丢失。

您应该只需要生成一个线程。只需让该线程在数据进入时从串行端口读取数据(通过将 QSerialPort 的 readyRead() 信号连接到调用 QSerialPort 对象上的 read() 的插槽),然后在它出现时发出一个信号(带有 QByteArray 参数)想向 GUI 发送一些串行数据。您的主/GUI 线程可以通过不会阻塞串行线程或主/GUI 线程的 QueuedConnection 接收数据。

这就是它的全部内容;唯一需要担心的是干净关机。确保有另一个跨线程信号/槽连接到 QThread 的 quit() 插槽,这样当需要退出时,您可以发出该信号,然后在 QThread 上调用 wait() 以等待它响应离开。一旦 wait() 返回,您就可以安全地删除 QThread 对象。

关于Qt 串口的 C++ 线程模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25679153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com