创建一个线程,在不冻结程序的情况下使函数休眠



我是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移动到在单独线程中运行的worker,以提高代码的清晰度。

最新更新