qt 线程和数据库
线程速览
线程启动 start(),配合以下:
QMutex m_mutex;
while (!isInterruptionRequested()) { // isInterruptionRequested 决定线程停止,就是循环条件
QMutexLocker lock(&m_mutex); // 给线程买一把锁
}
线程暂停:m_mutex.lock();
线程继续:m_mutex.unlock();
线程结束:
thread->requestInterruption(); // 循环退出,实现机制实际上是通过互斥锁+标识变量,通过维护标示变量来指定线程是否运行
thread->quit(); // 可以加上这个 等同exit(0) 即退出程序,停止线程
thread->wait();//但线程的结束并不是立刻进行的,可能是稍后发生的,如果在线程还未停止前调用了delete方法,会引发crash,这句话的意思是等待线程完全停止,然后再去delete
delete thread;
qt线程(2种方式):
1:
新建一个继承 QThread 的类myTherad(不能有ui),重写 run() 函数(真正新线程处理的地方,因为不方便随时调用所以一般是个while循环) 。
主线程 new 上面的那个类 myTherad* _myTherad = new myTherad(this)
开始运行 run() : _myTherad.start();
关闭子线程:退出循环 //不退也行;\n _myTherad->quit(); // 它会等你数据处理完了再操作,类似 exit(0) \n _myTherad->wait() // 等待你处理完回收资源
2(这种方式可以很方便随时调用方法使其在新线程运行):
先随意新建一个类 classTs,类里面有些方法
classTs* ts = new classTs; // 这里不能用this,因为你整个是要给子线程的
QThread* _myTherad = new QThread(this); // 创建子线程
ts->moveToThread(_myTherad ); // 把你随意建的类移动到子线程里面去,现在那个类就是属于子线程的人了
_myTherad->start(); // 开启线程
现在开始classTs类里的函数就都是在子线程里面运行了,至于怎么触发classTs类的函数,一般用型号槽,比如我点击主页面的一个按钮执行classTs类里的 a 函数,a函数就是在子线程里执行的了
关闭:_myTherad->quit(); _myTherad->wait();delete ts ;
qt使用数据库:
1.使用的编译器是 MinGM 或 MSVxx系统:一般MinGM在include环节没有问题,MSV的话有可能需要自己添加一下
2.安装qt的时候没有勾选上qsqldatabase,那么需要自己下载一个 libmysql.dll (https://pan.baidu.com/s/1UyCyhsER_GPMY6dWmcsCdw; hcvi) 放到 bin 目录(其它目录的话要自己加配置 INCLUDEPATH += 或者 LIBS += )
3. QT += sql
#include "widget.h" #include "ui_widget.h" #include <QSqlDatabase> #include <QDebug> #include <QSqlQuery> #include <QSqlError> #include <QVariantList> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); // 查看qt支持的数据口驱动 //qDebug() << QSqlDatabase::drivers(); // ("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7") QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("127.0.0.1"); db.setUserName("root"); db.setPassword("2580"); db.setDatabaseName("a"); if(!db.open()){qDebug() << "打开数据库失败" << db.lastError().text() ; return;} else qDebug() << "打开数据库成功"; QSqlQuery query; // 创建表 // query.exec("create table student(id int primary key auto_increment, name varchar(255),age int,score int)"); // 插入数据 //query.exec("insert into student(id, name,age,score) values(8,'zz',22,90)"); // 批量插入数据,使用预处理execBatch() /*query.prepare("insert into student(name,age,score) values(?,?,?)"); QVariantList nameList; nameList << "bb" << "cc" << "dd"; QVariantList ageList; ageList << 11 << 22 << 33; QVariantList scoreList; scoreList << 99 << 98 << 97; query.addBindValue(nameList); query.addBindValue(ageList); query.addBindValue(scoreList); query.execBatch();*/ // 开启事务(表示往后的操作都可以撤销)。如果1和3一起执行则表示要删除成员bb,但是又取消了,故不操作。1和2一起执行则表示要删除成员bb,并且确认删除故会删除bb /*// 1 QString sql = QString("delete from student where name = '%1'").arg("bb"); QSqlDatabase::database().transaction(); //开启一个事务 QSqlDatabase::database()可以获取当前操作的是哪个数据库,不需要全局 query.exec(sql); // 2 // QSqlDatabase::database().commit(); // 3 QSqlDatabase::database().rollback();*/ // 查找数据 query.exec("select * from student where name = 'aa' "); while(query.next()){ // 一行一行的遍历 // qDebug() << query.value("id").toInt() // << query.value("name").toString() // << query.value("age").toInt() // << query.value("score").toInt(); qDebug() << query.value(0).toInt() << query.value(1).toString() << query.value(2).toInt() << query.value(3).toInt(); } } Widget::~Widget() { delete ui; }
本文来自博客园,作者:封兴旺,转载请注明原文链接:https://www.cnblogs.com/fxw1/p/16633107.html