QT中线程睡眠对数据IO的影响——串口bug记录

发布时间 2023-05-09 22:44:21作者: 成信吴彦祖(略胜亿筹)

  这两天用QT做一个上位机,涉及到有一个数据发送完后需要用到延时,我一开始使用了线程休眠的方式进行延时:

//发送读取指令
if (serialport->write(data) == -1) {
    qDebug() << "发送失败!";
}

QThread::msleep(1000);
  
serialport->clear();

  然后我发现data并没有被发送出去,随后排查发现在data数据进入串口发送缓冲区后,调用线程休眠,数据并没有及时发送,而是等待线程唤醒后再发送数据。然而我们唤醒线程后立即执行了clear(),这时休眠前的数据还没发出去就被清理掉了,导致数据丢失。

  正确的方式还是使用定时器,以下是我定义的一个定时器延时函数:

//延时函数
void MainWindow::sleep( int msec)
{
    QTime dieTime = QTime::currentTime().addMSecs(msec);
    while( QTime::currentTime() < dieTime )
    QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}