Qt中的多线程QThread

一、Qt多线程基础

1、应用场景
  • 多任务的情况下需要开多个线程来分别进行处理。
  • 当一个UI界面有过于复杂耗时的计算要处理时,就不应该将这个耗时的计算和UI显示放在同一个线程下面。因为这样会导致UI卡死,或者程序不能响应的情况发生,此时应该重新开一个线程来处理这个复杂的计算。(如在计时器显示数字的线程中来处理一个复杂耗时的循环时,会导致整个UI停止响应,代码示例如下)
#include "Pr06_QThread.h"

Pr06_QThread::Pr06_QThread(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    num = 0;
    timer = new QTimer(this);
    timer->setInterval(200);

    connect(ui.pushButton, &QPushButton::clicked, this, &Pr06_QThread::BtnClicked);
    connect(timer, &QTimer::timeout, this, [=] {
        ui.labelDisplay->setText(QString::number(num++));
    });
}

//点击按钮之后就开始计时,同时会处理一个复杂的双循环。
void Pr06_QThread::BtnClicked()
{
    if (timer->isActive() == false)
    {
        timer->start();
    }

	//由于双循环数字大,会极其耗时,将导致程序在此卡死,失去响应
    for (uint i = 0; i < 99999999; ++i)
    {
        for (uint j = 0; j < 9999999; ++j)
        {
           uint tmp = i*j / 1000000000;
        }
    }
}

2、常用接口
  • QThread():创建线程构造函数
  • run:一个线程的起点,即线程处理函数,和主线程不在同一个线程中(只有该函数中的程序会在新线程中执行)。【注意】不能直接调用run函数来开启新的线程,必须要先通过调用start函数,然后start函数会自动调用run函数来开启一个新的线程(run函数是间接被调用的,不能直接进行调用)。
  • start:该函数参数为优先级,通过调用该函数来指定即将执行的线程优先级。该函数被调用后就会通过自动执行run函数来开启一个新的线程了。

二、多线程的使用

Qt中对多线程的使用有两种方式,如下:

  • 第一种是通过子类化QThread类,并在子类中重写run函数。其中run函数是一个线程的起点,新创建的线程会在对象调用start函数之后,开始执行对应线程中的run函数。
  • 第二种方式是通过moveToThread来将工作对象移动到指定的线程之中,然后调用start函数来让该对象在新创建的线程种执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值