Qt 线程池的使用以及和主线程的消息同步

8 篇文章 0 订阅

Qt中线程已经很早就出现了,关于多线程的使用的意义主要是为了减轻主线程的压力,提高用户的体验。
例如:在主线程中需要加载数据库中的很多表格,那么就可以考虑把多表格的读取放到工作线程中去,可以多加载几个线程目的就是加快读取表格的速度。
通过线程池和QRunable实现多线程。

1.编写QRunable

class LoadTableRunable : public QObject, public QRunnable {
    Q_OBJECT

public:
    LoadTableRunable(QObject *parent);
    ~LoadTableRunable();
    void initSqlStr(int id,std::string sqlStr);

    void run();
signals:
    void sigResult(int, std::vector<std::string>);
private:
    int id = -1;
    std::string sqlStr;
};
LoadTableRunable::LoadTableRunable(QObject *parent)
: QObject(parent) {
}

LoadTableRunable::~LoadTableRunable() {
}

void LoadTableRunable::run() {
    ThreadDatabase threadDatabase;
    threadDatabase.threadInitMySQL(GlobalDef::getInstance()->mySqlCfg);
    int numField = 0;
    std::vector<std::string>valueList;
    threadDatabase.threadQueryData(sqlStr, numField, valueList);
    threadDatabase.threadCloseMySQL();

    emit sigResult(id, valueList);
}

void LoadTableRunable::initSqlStr(int id, std::string sqlStr) {
    this->id = id;
    this->sqlStr = sqlStr;
}

2.启动线程线程,并且加到线程池中

void LoadTaskManager::loadTask(t_task_exten task) {
    LoadTableRunable* runEquipModel = new LoadTableRunable(nullptr);
    //注意信号槽的连接方式为Qt::BlockingQueuedConnection,就是为了可以跨线程
    connect(runEquipModel, SIGNAL(sigResult(int, std::vector<std::string>)), this, SLOT(slotSqlResult(int, std::vector<std::string>)), Qt::BlockingQueuedConnection);
    runEquipModel->initSqlStr(1, "select * from model");
    QThreadPool::globalInstance()->start(runEquipModel);
}
//还可以多加载几个表格

以上QRunable添加id的目的就是为了通过信号槽的方式把查询到的数据回传回来,通过id方便辨识是查询到哪张表

3.获取查询的结果

接收信号的槽函数

//槽函数 - 执行完成后的放回结果
void LoadTaskManager::slotSqlResult(int id, std::vector<std::string> valueList) {
    switch (id) {
    case 1:

    default:
    break;
    }
}

通过ID就可以出来不同线程回传过来的数据。以上就可以了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值