一、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
函数来让该对象在新创建的线程种执行。