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

Posted

技术标签:

【中文标题】创建一个线程使函数休眠而不冻结程序【英文标题】:Create a thread to make a function sleep without freezing the program 【发布时间】:2020-12-20 22:13:56 【问题描述】:

我是 QT 的新手,我正在尝试创建一个从串行端口读取数据并创建绘图的程序,在该绘图中,每十秒在集合中绘制一个新点,我使用了函数 QThread: :睡眠(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

【问题讨论】:

在 Qt 中执行此类操作的常用方法是使用 QTimer。将其超时信号连接到更新绘图的函数。 【参考方案1】:

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

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

【讨论】:

以上是关于创建一个线程使函数休眠而不冻结程序的主要内容,如果未能解决你的问题,请参考以下文章

线程睡眠冻结了我的代码。 Java 客户端-服务器通信

如何使用信号调用同一进程中的另一个线程在轮询函数上休眠的进程而不杀死它?

Kivy 和无限线程循环 - 应用程序冻结

从辅助线程调用主线程函数

如何在收到异步函数的回调之前使线程休眠?

如何让node.js中的线程休眠而不影响其他线程?