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

版权声明:本文为博主原创文章,未经同意不允许转载! https://blog.csdn.net/wb175208/article/details/81747140

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就可以出来不同线程回传过来的数据。以上就可以了

猜你喜欢

转载自blog.csdn.net/wb175208/article/details/81747140