创建一个线程使函数休眠而不冻结程序

问题描述

我是QT的新手,我正在尝试创建一个程序,该程序从串行端口读取数据并创建绘图,在该绘图中,每隔十秒钟绘制一个新的点集,我使用了QThread函数: :sleep(10);使程序进入睡眠状态,但这会冻结所有窗口,因此我无法关闭它或执行其他任何操作。

   void MainWindow::Reader()
{
  //Letura dei dati
  serial->waitForReadyRead();
  m_readData=serial->QSerialPort::readAll();
  //Sgrossatura dei dati
     inter=QString(m_readData);
    QStringList firstlist2= inter.split("$");
    m_readData2=firstlist2.takeFirst();
    inter2=QString(m_readData2);
    QStringList firstlist3= inter2.split(" ");
    m_readData3=firstlist3.takeFirst();
    H=m_readData3.todouble();
    QStringList firstlist4=inter2.split(" ");
    m_readData4=firstlist4.takeLast();
    T=m_readData4.todouble();
    //ottenere dal timer la variabile tempo
      double milli=timer.elapsed();
      double sec=milli/1000;
      double min=sec/60;
      double ore=min/60;
      //Creazione dei punti
        addPoints(H,T,min);
        //Aggiunta dei punti ai grafici
          PLottER_H();
          PLottER_T();
          //Programma in stand-by per 5 minuti
          int a=10000;
            QThread::sleep(10);           //300
}

有人可以帮助我吗?enter code here

解决方法

您在gui线程中使用“阻塞”操作serial->waitForReadyRead(),它会冻结gui线程,直到串口收到任何数据。而是将 QSerialPort::readyRead 连接到插槽并在那里读取数据。这样,您根本不需要任何计时器或睡眠。如果您在 gui 线程事件循环冻结中调用 QThread::sleep() - 没有收到鼠标或键盘事件,所有小部件都没有响应。

我建议将 QSerialPort 移动到在单独线程中运行的工作线程以提高代码清晰度。