Qt单例线程教程

一、适用场景

适合于可能被整个工程任意处被使用,且不必要被重复创建的场景。例如数据库相关、接收信息相关的类。

二、编写

以下以数据库单例线程为例子

单例线程本质上还是线程,所以继承于QThread,头文件要包含<QThread>。

h文件

#ifndef DATABASETHREAD_H
#define DATABASETHREAD_H

#include <QThread>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>

class DatabaseThread : public QThread
{
    Q_OBJECT
public:
    explicit DatabaseThread(QObject *parent = nullptr);
    static DatabaseThread *Instance(){
        if(!s_DatabaseThread){
            s_DatabaseThread = new DatabaseThread;
        }
        return s_DatabaseThread;
    }
    static void deleteInstance(){
        if(s_DatabaseThread){
            s_DatabaseThread->quit();
            s_DatabaseThread->wait();
            s_DatabaseThread->deleteLater();
            s_DatabaseThread = Q_NULLPTR;
        }
    }
    void testfunction();//数据库使用相关的函数可在此声明

private:
    static DatabaseThread *s_DatabaseThread;
    QSqlDatabase db;
};

#endif // DATABASETHREAD_H

cpp文件

DatabaseThread *DatabaseThread::s_DatabaseThread = 0;
DatabaseThread::DatabaseThread(QObject *parent) : QThread(parent)
{
    if(QSqlDatabase::contains("Data"))
        db = QSqlDatabase::database("Data");
    else
        db = QSqlDatabase::addDatabase("QSQLITE","Data");
    db.setDatabaseName("Liquidflash.db3");
    db.open();
}

三、使用

单例线程不需要手动创建或初始化,在使用的类中包含一下#include “databasethread.h”
然后直接按以下方式调用方法:

DatabaseThread::Instance()->testfunction();

不需要担心由于没有手动创建和初始化导致的单例构造函数不执行,单你首次使用到单例线程时(无论是调用其中哪个函数),都会自动先执行构造函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值