Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 创建一个线程使函数休眠而不冻结程序_Multithreading_Qt_Sleep_Freeze - Fatal编程技术网

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

Multithreading 创建一个线程使函数休眠而不冻结程序,multithreading,qt,sleep,freeze,Multithreading,Qt,Sleep,Freeze,我是QT新手,我试图创建一个程序,从串口读取数据并创建一个绘图,在这个绘图中,每隔10秒设置一个新的点,我使用了函数QThread::sleep(10);使程序休眠,但这会冻结所有窗口,因此我无法关闭它或执行任何其他操作 void MainWindow::Reader() { //Letura dei dati serial->waitForReadyRead(); m_readData=serial->QSerialPort::readAll(); //Sgr

我是QT新手,我试图创建一个程序,从串口读取数据并创建一个绘图,在这个绘图中,每隔10秒设置一个新的点,我使用了函数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
}
有人能帮我吗?
在这里输入代码

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


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

在Qt中执行此类操作的常用方法是使用一个。将其超时信号连接到更新绘图的函数。