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