QT多线程编程

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();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值