c++ - 带线程的 QSerialPort

标签 c++ multithreading qt5

我一直在为一个通过 Qt 中的串行端口进行通信的项目苦苦挣扎了大约两周。首先我尝试了信号/槽方法,它遗漏了一些数据。然后我决定为此使用一个线程,但我得到了相同的结果。当应用程序的窗口正在调整大小或最大化/最小化时,即使在窗口栏上按住鼠标左键,它也会丢失一些数据。请帮助我这个条件。

主窗口构造函数:

SerialPort *serial= new SerialPort();
serial->moveToThread(&cThread);

connect(this , &MainWindow::finished, &cThread, &QThread::quit);
connect(this , &MainWindow::destroyed, this, &SerialPort::deleteLater);
connect(serial, &SerialPort::getData, this, &MainWindow::displayData);

cThread.start();

串口读取线程:

void SerialPort::newData()
{
     mutex.lock();
     bArray.insert(bArray.length(),serial->readAll());
     mutex.unlock();

     emit getData(&bArray,&mutex);
}

SerialPort 构造函数:

serial = new QSerialPort();
connect(serial, &QSerialPort::readyRead, this,  &SerialPort::newData);

bArray.clear();

fill_serial_ports();
portName = find_stm32_port();

serial->setReadBufferSize(20*1024*1024); // it's a huge buffer.
bArray.reserve(20*1024*1024);  // it's a huge buffer.

open_serial_port();

此外,我认为这可能是一个错误,它丢失了一些数据并写入了错误跟踪器。受让人说 QSerialPort 永远不会丢失数据,而且我的代码是错误的。我很困惑,我不知道哪里出错了。拜托,你能检查我的其他解决方案吗?哪里错了?

我的错误跟踪器报告(未接受):https://bugreports.qt.io/browse/QTBUG-61233

最佳答案

此问题已由 Denis Shienkov 在 qtbugreports 中解决。您可以查看带线程的串行端口的 qsp-no-freeze-workaround-windows.zip 示例。

链接:https://bugreports.qt.io/browse/QTBUG-61233

关于c++ - 带线程的 QSerialPort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44374351/

相关文章:

c++ - 使用 'delete' 时出现语法错误

c++ - 循环复杂度

android - QSetting 不适合我

android - 使用 Qt5 为 iOS 和 Android 创建应用程序

c++ - 避免使用带有默认参数的类模板的括号

c++ - 延迟缓冲区的概念是否在 ODBC 之外的任何地方使用?

c# - 为什么这个程序在没有 bool 条件变量的波动性的情况下不会进入无限循环?

multithreading - 基于 C++0x 线程标准构建的 Actors 实现

java - 如何测量线程堆栈深度?

c++ - 使用 QTreeView,如何仅突出显示具有调用函数的特定行/列?