Qt中使用多线程的注意事项:
// 判断线程中的任务是不是处理完成
bool QThread::isFinished() const;
// 判断子线程是否运行
bool QThread::isRunning() const;
// 当前线程的优先级
Priority QThread::priority() const;
void QThread::setPriority(Priority priority);
// 优先级:
// QThread::IdlePriority --> 最低的优先级
// QThread::LowestPriority
// QThread::LowPriority
// QThread::NormalPriority
// QThread::HighPriority
// QThread::HighestPriority
// QThread::TimeCriticalPriority --> 最高的优先级
// QThread::InheritPriority --> 子线程和其父线程的优先级相同, 默认是这个
// 退出线程函数
void QThread::exit(int returnCode = 0);
// 调用线程退出函数之后, 线程不会马上退出;因为当前任务有可能还没有完成, 调回用这个函数是等待任务完成, 然后退出线程, 一般情况下会在 exit() 后边调用这个函数
bool QThread::wait(unsigned long time = ULONG_MAX);
// 和调用 exit() 效果是一样的
// 调用这个函数之后, 再调用 wait() 函数
[slot] void QThread::quit();
// 启动子线程
[slot] void QThread::start(Priority priority = InheritPriority);
// 线程退出, 可能是会马上终止线程, 一般情况下不使用这个函数(可能会出错)
[slot] void QThread::terminate();
// 线程中执行的任务完成了, 发出该信号
// 任务函数中的处理逻辑执行完
[signal] void QThread::finished();
// 开始工作之前发出这个信号, 一般不使用
[signal] void QThread::started();
// 返回当前执行线程的QThread的指针
[static] QThread *QThread::currentThread();
// 返回可以在系统上运行的理想线程数 和当前电脑的 CPU 核心数相同
[static] int QThread::idealThreadCount();
// 休眠函数
[static] void QThread::msleep(unsigned long msecs); // 单位: 毫秒
[static] void QThread::sleep(unsigned long secs); // 单位: 秒
[static] void QThread::usleep(unsigned long usecs); // 单位: 微秒
继承QThread,实现run函数
[virtual protected] void QThread::run();
class myThread:public QThread{
protected:
void run(){
// 实现
}
signals:
void SigFinished(void);// run()函数执行结束后自动触发
}
myThread * subThread = new myThread();
connect(myThread, &myThread::SigFinished, myThread, QThread::deleteLater);//自动释放
subThread->start(); // 启动线程
如果线程中有操作UI或者与其他模块交互的需求;通过信号将信息传递出去。
#include
class myThread : public QThread
{
Q_OBJECT
public:
explicit myThread(QObject *parent = nullptr);
protected:
void run(){
qDebug() << "当前线程对象的地址: " << QThread::currentThread();
int num = 0;
while(1)
{
emit curNumber(num++);
if(num == 10000000)
{
break;
}
QThread::usleep(1);
}
qDebug() << "run() 执行结束, 子线程退出...";
}
signals:
// 自定义信号, 传递数据
void curNumber(int num);
public slots:
};
从QObject派生一个类
类中添加一个公共成员函数(也可以添加多个,在不同的线程中执行),函数就是要在线程中执行的业务
class MyWork:public QObject{
public:
// 函数名称自定义,合法名称都可以
void myWork();
}
QThread * sub = new QThread();
// 如果给woker指定了父对象, 这个函数调用就失败了
MyWork * worker = new MyWork();
// 移动到子线程中工作
worker->moveToThread(sub);
// 连接QThread的started信号,在调用sub->start()开始执行myWork()
QObject::connect(sub, &QThread::started, worker, &MyWork::myWork); // 连接信号和槽函数
sub->start(); // 启动新线程
moveToThread函数的注意事项: