Qt之多线程QThread简介

QThread提供了Qt平台下独立的线程操作。这里简单的介绍一下QThread的内容及其使用方法。

1、为什么会使用多线程?

关于多线程的好处不做赘述,应该都清楚。对于Qt而言,它侧重于应用程序图形界面的设计,主UI界面一般是作为主线程来操作,当你需要运行一个比较费时的操作的时候,主线程在后台执行操作,主UI界面表现为卡顿,这个就很不方便,这里我们可以引进多线程。

2、Qt的多线程–QThread

这里先看一下QThread类在VS下的定义:

class Q_CORE_EXPORT QThread : public QObject
{
public:
    static Qt::HANDLE currentThreadId();
    static QThread *currentThread();
    static int idealThreadCount();
    static void yieldCurrentThread();

    explicit QThread(QObject *parent = 0);
    ~QThread();

    enum Priority {
        IdlePriority,

        LowestPriority,
        LowPriority,
        NormalPriority,
        HighPriority,
        HighestPriority,

        TimeCriticalPriority,

        InheritPriority
    };

    void setPriority(Priority priority);
    Priority priority() const;

    bool isFinished() const;
    bool isRunning() const;

    void setStackSize(uint stackSize);
    uint stackSize() const;

    void exit(int retcode = 0);

public Q_SLOTS:
    void start(Priority = InheritPriority);
    void terminate();
    void quit();

public:
    // default argument causes thread to block indefinately
    bool wait(unsigned long time = ULONG_MAX);

Q_SIGNALS:
    void started();
    void finished();
    void terminated();

protected:
    virtual void run();
    int exec();

    static void setTerminationEnabled(bool enabled = true);

    static void sleep(unsigned long);
    static void msleep(unsigned long);
    static void usleep(unsigned long);

#ifdef QT3_SUPPORT
public:
    inline QT3_SUPPORT bool finished() const { return isFinished(); }
    inline QT3_SUPPORT bool running() const { return isRunning(); }
#endif

protected:
    QThread(QThreadPrivate &dd, QObject *parent = 0);

private:
    Q_OBJECT
    Q_DECLARE_PRIVATE(QThread)

    static void initialize();
    static void cleanup();

    friend class QCoreApplication;
    friend class QThreadData;
};

QThread这个类首先他继承了QObject这个类,QObject是Qt里面十分底层的一个类,Qt里的object基本都会继承这个类,关于QObject以后可以介绍一下。

QThread成员简介:

static Qt::HANDLE currentThreadId();
返回当前线程的ID号
static QThread *currentThread();
返回线程句柄。
static int idealThreadCount();
返回能被运行在系统上的理想的线程数。
static void yieldCurrentThread();
让开线程给另一个可运行的线程。至于具体执行哪个线程这是有系统调度决定的

前两个成员函数是当前线程的相关,后两个是与系统的所有线程相关。

enum Priority {
        IdlePriority,

        LowestPriority,
        LowPriority,
        NormalPriority,
        HighPriority,
        HighestPriority,

        TimeCriticalPriority,

        InheritPriority
    };

这里枚举了8个线程的优先级

0:最低等级,只有当系统没有线程在运行的时候才执行
1:小于低优先级的等级
2:小于正常线程的等级
3:正常的默认的系统等级
4:高于系统默认优先级的等级
5:大于高优先级的等级
6:尽可能的安排优先级
7:使用同样的优先级

优先级的设置可以通过void setPriority(Priority priority)调用
eg:

thread->setPriority(QThread::HighPriority);

线程状态可以通过通过下面两个变量获取,isFinished和isRunning查询线程的状态,使用wait来阻塞,直到线程已经完成运行。:

bool isFinished() const;//线程已结束
bool isRunning() const;//线程已开启
QThread的SIGNALS

可以通过槽函数将不同的线程链接起来,并由信号量触发相应的事件

Q_SIGNALS:
    void started();
    void finished();
    void terminated();
QThread的SLOT函数
public Q_SLOTS:
    void start(Priority = InheritPriority);//启动线程
    void terminate();//终止线程,不推荐使用
    void quit();//退出线程
TIPS:

1、开启线程的方式可以通过start来开始,开始了之后会通过run函数来运行
2、多线程很多情况下是和while循环一起使用,退出的使用不推荐直接使用terminate粗暴的退出,很多时候并不能立马退出,而且还会导致系统崩溃。一般的方式是修改while循坏的条件,让它自己退出循环再结束。

QThread的Sleep函数
static void sleep(unsigned long);//单位为秒
static void msleep(unsigned long);//单位为毫秒
static void usleep(unsigned long);//单位为微秒
TIPS:

很多时候,我们使用过了线程,但是又不需要立马结束他,如果一直在while循环中,cpu的开销会很大,如果不需要数据的实时性或者只需要线程在等待的时候,最好加上sleep,这样会很多程度的降低系统的开销

其他函数
void setStackSize(uint stackSize);//设置线程堆栈的大小
uint stackSize() const;

static void setTerminationEnabled(bool enabled = true);//设置terminate有效性

Priority priority() const;//返回当前线程运行级别,不运行就是inheritPriority

关于Qt的多线程使用下面再做介绍,这里先简单介绍一下QThread这个类

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值