开启一个新线程,死循环接收串口数据
一. 在工程添加threa.h和thread.cpp
thread.h
#ifndef THREAD_H
#define THREAD_H
#include <QThread>
class Thread : public QThread
{
Q_OBJECT
public:
Thread();
void stop();
protected:
void run();
private:
volatile bool stopped;
signals:
void ThreadMyCom(const QString &);//定义一个信号:串口接收信号
};
#endif // THREAD_H
thread.cpp
#include "thread.h"
#include "mainwindow.h"
extern Win_QextSerialPort *p_SerialPort;
Thread::Thread()//开启线程时,先执行构造函数,再执行run()
{
stopped = false;
}
void Thread::run()
{
QString str;
while(!stopped)
{
str= p_SerialPort->readAll();
emit ThreadMyCom(str);//当接收到新数据时,产生一个信号ThreadMyCom,该信号和另一个文件中(本例为mainwindow.cpp)的串口数据处理函数相关联(即工程跳转到串口数据处理函数继续执行)
msleep(10);
}
stopped = false;
}
void Thread::stop()
{
stopped = true;
}
二. 在相应的文件的头文件(本例为mainwindow.h)加上
#include "thread.h"
并在私有槽函数里面加上串口数据处理函数的声明
private slots:
void readMyCom(const QString &);
再声明一个私有变量
private:
Thread* threadA;//声明thread变量
三. 在相应的文件的cpp文件(本例为mainwindow.cpp)的构造函数中加入
threadA = new Thread();//定义thread变量
connect(threadA,SIGNAL(ThreadMyCom(QString)),this,SLOT(readMyCom(QString)));//关联串口接收信号和串口数据处理函数
编写串口数据处理函数void MainWindow::readMyCom(const QString &str){};
最后,执行start()即可开启多线程,开启的线程先进入线程构造函数,然后执行run()函数;执行stop()退出该线程。
if(threadA->isRunning())//判断线程是否处于开启状态
{
threadA->stop();
}
else
{
threadA->start();
}
目的:想在B.cpp中应用A.cpp的变量temp
(此例中A为mainwindow,B为thread)
方法:
一. 在A.cpp中(注意:不是头文件中)定义变量temp
#include "mainwindow.h"
#include "SerialPort.h"
int temp;
MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags){}
二. 在B.cpp中(注意:不是头文件中)定义时加上extern,并加上A的头文件A.h
#include "thread.h"
#include "mainwindow.h"
extern int temp;
Thread::Thread(){}