QT线程基础

线程基础

一、类QThread

创建线程的,一个线程有一个类,该类继承QThread即可,重写run则是他的行为,实例化后直接.start()开始线程;

//继承QThread的Mythread中重写run()
void MyThread::run()
{
    for(int i=1;i<=5;i++)
    {
        qDebug()<<i;
        sleep(1);
    }
}

二、类QSemaphore

  1. 信号量,实现信号的同步,即线程执行顺序
  2. 信号量的类需要声明为单例模式,即仅在第一次调用时生成静态指针
//信号量管理类的头文件
#ifndef SEMMANAGER_H
#define SEMMANAGER_H
#include <QSemaphore>
class SemManager
{
public:
    //信号量AB
    QSemaphore A;
    QSemaphore B;
    //必须设置成单例模式
    static SemManager* getInstance();
private:
    static SemManager* instance; //静态数
    SemManager();
};
#endif // SEMMANAGER_H

//信号量管理类的实现文件
#include "semmanager.h"
SemManager* SemManager::instance=0;
SemManager::SemManager()
    :A(1),B(0)
{
 //注意互斥量的初始话
}
SemManager*  SemManager::getInstance()
{
    //创建一次后不再为0,实现了单例模式
    if(instance == 0)
    {
        instance= new SemManager;
    }
    //每次调用都是得到该静态变量指针
    return instance;
}
  1. 真正使用时: 两线程都需要在开始后调用SemManager::getInstance()实例化信号量管理类,但其实是同一个,再在行为中对信号量进行操作
void MyThread1::run()
{
    SemManager *sm=SemManager::getInstance();
    for(int i=1;i<=5;i++)
    {
        sm->B.acquire(); //默认是0,所以启动时是不可以执行的
        qDebug()<<i*10;
        sleep(1);
        sm->A.release();
    }
}
  1. 类QSemaphore的函数接口
QSemaphore::QSemaphore(int n=0); //构造函数,i信号量数
int QSemaphore::avilable(); //获取信号量的剩余数
void QSemaphore::release(int n=1); //添加信号量
void QSemaphore::acquire(int n=1); //减少信号量

三、类QMutex

  1. 类QMutex用于保护一段代码在同一时刻只有一个线程可以执行。对QMutex对象可以进行上锁和解锁的操作。当某线程对QMutex对象上锁后,其他线程在对QMutex对象上锁时,线程会阻塞,直到QMutexi对象被解锁
  2. 可实现对全局资源的互斥使用
  3. QMutex的函数接口
//需要在线程对象中添加 
QMutex mutex; //锁属性
//在线程的run中
mutex.lock();  //头加入
mutex.unlock();//尾加入
//上面是同个线程类实例出不同对象的操作,但事实上是需要是对资源进行的操作

线程高级

一、主线程来负责刷新界面等

  1. 当QT程序启动时会调用QApplication:exec()启动事件循环,该线程称之为主线程。
  2. 主线程的主要作用是处理各种界面的事件和槽函数。而当槽函数耗时过长时会导致界面出现卡顿的现象,影响用户体验。
  3. 顾可以使用线程来执行槽函数
  4. 可以使用以下QObjecti的成员函数来将某个对象的槽函数交给线程执行:void QObject::moveToThread(QThread *tragetThread);
  5. 注意:任何继承自QObject的对象都可以使用该成员函数,但是使用该函数时必须确保该对象在构造时没有指定父对象。
  6. 代码的意思:一个窗口,点击时候触发槽函数,槽函数是每一秒发一个信号(该信号的槽函数是显示数字),发五次。
    在这里插入图片描述
  7. 使用QThread自带的事件循环,将槽函数交由线程处理
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt线程是Qt框架提供的一种多线程编程的解决方案,通过创建和管理多个线程,可以实现在程序中同时执行多个任务的能力。Qt提供了QThread类和QtConcurrent命名空间来支持多线程。 QThread类是Qt提供的多线程编程的基础类,它封装了与底层操作系统调用相关的函数,并提供了一套简单的API来管理线程的生命周期。通过继承QThread类,我们可以创建自己的线程类,并实现线程执行体run()函数。调用线程的start()函数即可启动线程,并在run()函数中实现需要在新线程中执行的任务。另外,QThread类还提供了其他一些方法,如wait()、msleep()等,用于线程的控制。 QtConcurrent命名空间是Qt提供的一个高级多线程编程的工具,其使用起来更加简单方便。QtConcurrent可以运行同步和异步的任务,主要通过函数调用和lambda表达式来实现。我们可以使用QtConcurrent提供的函数,比如map()、filter()等,将任务分解成多个小的任务,并在多个线程中同时执行。使用QtConcurrent,我们只需要关注任务的输入和输出,而无需关注线程的创建和管理。 无论是使用QThread类还是QtConcurrent命名空间,Qt线程都遵循的原则是将任务分解成小的子任务,并在多个线程中同时执行,以提高程序的性能和响应速度。同时,Qt线程也提供了线程间的通信机制,例如使用信号与槽机制、使用QMutex、QSemaphore等同步对象来保证数据的正确访问。 需要注意的是,在多线程编程中,我们需要注意线程之间的同步和互斥,以避免资源竞争和数据不一致等问题。Qt提供了多种同步和互斥的机制,如互斥锁、条件变量等,可以根据具体的需求选择合适的方式来保证线程之间的安全性。 总之,Qt线程提供了一种方便易用的多线程编程解决方案,使我们可以在Qt程序中充分利用多核处理器的能力,提高程序的性能和用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值