QT多线程编程
最近的项目中用到了QT的多线程编程,在QT4.8之后推荐使用的子线程创建方式相对较为繁琐,在这里简单记录下。基本流程如下图所示:
一.创建子线程
1.1创建子线程类型
在QT中每一个子线程需要设计一个基类为QObject类型的自定义子线程类型对象,这个类型中至少要包含线程处理函数,线程运行标志位以及标准位的设置函数。子线程的处理函数默认返回类型为Void,如果不是void类型在暂停或退出子线程时必须要要有返回值否则推出或暂停子线程会出错。
class MyThread : public QObject
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
void Work();
void SetFlag(bool isStop); //!!!没有返回值时必须要用Void类型
signals:
void Timer();
public slots:
private:
bool isStop;
};
1.2创建子线程类型对象和Qthread类型对象
要在主线程在运行过程中开启子线程,就必须在主线程类型中添加子线程程类型成员和Qthread类型对象的成员,值得注意的是在创建子线程类型对象时不能声明他的父组件是当前类,而Qthread类型可以。
this->ThreadPool=new QThread(this); //ThreadPool 为QThread类型对象 ,创建时可以指定父组件
this->SubThread=new MyThread; //SubThread 为自定义子线程类型对象,创建时一定不能指定父组件 !!!
1.3将子线程类型成员与QThread 类型成员对象绑定
主线程通过QThread类型成员开启子线程,因此在开启子线程前一定要将两者先进行绑定。
SubThread->moveToThread(ThreadPool); //将自定义子线程类型对象(SubThread)与QThread类型成员(ThreadPool)绑定
二.开启子线程
2.1开启QThread 类型对象
2.2设置子线程运行标志位
2.3发射预先关连的调用子线程处理函数信号调用子线程处理函数
connect(this,&MainWindow::StartThread,SubThread,&MyThread::Work); //与相连接完成
void MainWindow::on_Starts_clicked()
{
ThreadPool->start(); //QThread类型对象启动
this->SubThread->SetFlag(false); //设置子线程处理函数运行标志位
emit StartThread(); //发射调用子线程处理函数指令
}
void MyThread::Work() //子线程调用的子线程处理函数
{
while (isStop==false) {
...
}
}
三.暂停子线程
void MainWindow::on_Stop_clicked()
{
this->SubThread->SetFlag(true); //设置子线程执行函数标志位,停止子线程函数运行
}
四.删除子线程
void MainWindow::DealClose()
{
this->SubThread->SetFlag(true);
ThreadPool->quit();
ThreadPool->wait();
}