一 Qt多线程(QThread)
1 创建线程方法1:QObject::moveToThread
class Myclass:public QObject{
Q_OBJECT
public slots:
void func(void){
//耗时或阻塞操作,需要放在子线程中执行
}
};
QThread thread;//子线程对象
Myclass myobject;//需要放在子线程中工作对象
myobject.moveToThread(&thread);//将myobject对象移动到子线程中
connect(xx,SIGNAL(xx),&myobject,SLOT(func()));//连接信号和槽函数
thread.start();//开启子线程
2 创建线程方法2:继承QThread,重写线程入口函数run
class MyClass:public QThread{
protected:
virtual void run(void){
//耗时或阻塞操作,需要放在子线程中执行
}
};
MyClass mythread;//创建子线程对象
mythread.start();//开启子线程,子类中重写run函数将会在子线程中执行
案例:多线程打印消息
1)方法1:工程(Thread1)
2)方法2:工程(Thread2)
3 线程同步
1)互斥锁:QMutex
eg:
QMutex mutex;
void run(void){
mutex.lock();//加锁
//访问共享资源start
if(“Error1”){
mutex.unlock();//解锁
return;
}
else if(“Error2”){
mutex.unlock();//解锁
return;
}
//访问共享资源end
mutex.unlock();//解锁
}
------------------------------------
eg:QMutexLocker简化加锁和解锁过程;
QMutex mutex;
void run(void){
QMutexLocker locker(&mutex);//加锁
//访问共享资源start
if(“Error1”){
return;
}
else if(“Error2”){
return;
}
//访问共享资源end
}//析构locker时,在析构函数中自动解锁
2)信号量:QSemaphore
//初始化信号量计数值5,表示有5个可用的共享资源
QSemaphore sem(5); // sem.available() == 5
//获取3个共享资源,剩余2个可用的共享资源
sem.acquire(3); // sem.available() == 2
//获取2个共享资源,剩余0个可用的共享资源
sem.acquire(2); // sem.available() == 0
//释放5个共享资源,剩余5个可用的共享资源
sem.release(5); // sem.available() == 5
//又分配5个共享资源,剩余10个可用的共享资源
sem.release(5); // sem.available() == 10
//尝试获取1共享资源,剩余9个可用的共享资源,获取成功
sem.tryAcquire(1); // sem.available() == 9, returns true
//尝试获取250共享资源,剩余9个可用的共享资源,获取失败
sem.tryAcquire(250); // sem.available() == 9, returns false
案例:生产者和消费者
#include <QtCore>
#include <stdio.h>
#include <stdlib.h>
const int DataSize = 100000;//要生产产品数量
const int BufferSize = 8192;
char buffer[BufferSize];//缓冲区,大小8K
QSemaphore freeBytes(BufferSize);//控制生产者信号量,初始化计数:8K
QSemaphore usedBytes;//控制消费者信号量,初始化计数:0
class Producer : public QThread //生产者线程
{
public:
void run() Q_DECL_OVERRIDE
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
for (int i = 0; i < DataSize; ++i) {
freeBytes.acquire();//获取生产者信号量:计数-1
buffer[i % BufferSize] = "ACGT"[(int)qrand() % 4];
usedBytes.release();//释放消费者信号量:计数+1
}
}
};
class Consumer : public QThread//消费者线程
{
Q_OBJECT
public:
void run() Q_DECL_OVERRIDE
{
for (int i = 0; i < DataSize; ++i) {
usedBytes.acquire();//获取消费者的信号量:计数-1
fprintf(stderr, "%c", buffer[i % BufferSize]);
freeBytes.release();//释放生产者的信号量:计数+1
}
fprintf(stderr, "\n");
}
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);//创建没有GUI应用的程序
Producer producer;//生产者
Consumer consumer;//消费者
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return 0;
}
二 Qt数据库
1 数据库简介
1)概念
数据库是以一定方式存储在一起、能为多个用户共享、具有尽可能小的冗余特性,是与应用程序彼此独立的数据集合。
2)相关术语
–》DB:数据库(database)
–》DBA:数据库管理员
–》RDB:关系式数据库
–》DBMS:数据库管理系统
3)常见的数据库
–》甲骨文的Oracle
–》IBM的DB2
–》微软的Sqlserver
–》Sun的Mysql
–》开源的Sqlite
4)数据库操作语言(SQL)
2 Sqlite数据库
1)安装Sqlite
sudo apt-get install sqlite3
2)测试
在终端输入"sqlite3"命令,即可进入数据库命令操作界面。
注:在“sqlite>”命令界面中可以输入两种指令,一种指令以".“开头,可以实现对数据库配置和设置数据显示方式;还有一种指令是“Sql语句”,这些指令以”;“结束,实现对数据的增删改查等管理操作。
3)常用的sqlite自身配置和格式显示相关指令
–>.help //查看这些指令的帮助信息
–>.exit或.quit //退出数据库回到控制终端
–>.open testDB.db //打开testDB.db数据库文件
–>.database //查看数据库名字和对应的文件名
–>.table //查看数据库中数据表的名字
–>.mode MODE //设置数据表显示模式,MODE:list(默认)/column/tab/html…
–>.header on //显示数据表的表头(列名)
–>.schema //查看数据表创建时的详细信息
–>.nullvalue “NULL” //设置数据表空白位置显示"NULL”
注:清屏"ctrl+L"
注:执行"SELECT * FROM company;"可以查看company数据中所有的数据
注:可以将上述指令写入配置文件中,将来重新进入数据库界面时会自动执行。
vi /home/tarena/.sqliterc
.mode tab
.header on
.nullvalue “NULL”
3 在命令行中使用"SQL"语言操作数据库 //重点
1)创建数据表
语法:
CREATE TABLE 表名 (列名1 数据类型 [约束],列名2 数据类型 [约束],…);
常用数据类型:INT(整型数) TEXT(字符串) REAL(浮点数)
常用约束:
NOT NULL:非空约束,表示该类数据不能为空
PRIMARY KEY:主键约束,表示该列数据唯一,可以加快对数据的访问
eg:
sqlite> CREATE TABLE student (
…> id INT NOT NULL PRIMARY KEY,
…> name TEXT NOT NULL,
…> score REAL NOT NULL );
sqlite> .table //查看已存在数据表名字
company student
-
删除数据表
语法:
DROP TABLE 表名;
注:慎用,数据表一旦删除,里面所包含的数据也将随之消失!
eg:
sqlite> .table
company student
sqlite> DROP TABLE student;
sqlite> .table
company
-
向数据表插入数据
语法:
INSERT INTO 表名 (列名1,列名2,…) VALUES(数值1,数值2,…);
eg:
sqlite> INSERT INTO company
…> (id,name,age,address,salary)
…> VALUES(10018,‘貂蝉’,22,‘山东’,13000.5);
sqlite> SELECT * FROM company;
sqlite> INSERT INTO company
…> (name,id,age,salary)
…> VALUES(‘小乔’,10019,21,12000);
sqlite> INSERT INTO company
…> VALUES(10021,‘孙尚香’,26,‘江南’,9000);
-
从数据表中删除数据
语法:
DELETE FROM 表名 WHERE 条件表达式; //删除满足条件的若干条数据
DELETE FROM 表名 WHERE 条件1 and 条件2;//删除同时满足两个条件的数据
DELETE FROM 表名 WHERE 条件1 or 条件2;//删除满足条件或条件2的数据
注:如果有多个条件可以使用逻辑与(and)或者逻辑或(or)连接
eg:
sqlite> DELETE FROM company
…> WHERE id = 10029;
sqlite> DELETE FROM company
…> WHERE age>25 and address=‘江南’;
-
修改数据表中已存在的数据
语法:
UPDATE 表名 SET 列名1=新数值,列名2=新数值,… WHERE 条件表达式;
eg:
sqlite> UPDATE company
…> SET age = 22
…> WHERE id=10012;
sqlite> UPDATE company
…> SET salary=salary+2000
…> WHERE age>=28 and age<=35;
-
查询数据表中的数据
语句:
SELECT 列名1,列名2,… FROM 表名;
SELECT 列名1,列名2,… FROM 表名 WHERE 条件表达式;
SELECT 列名1,列名2,… FROM 表名 WHERE 条件表达式 ORDER BY 列名 排序方式;
注:排序方式关键字ASC(升序) DESC(降序)
eg:
sqlite> SELECT salary,name FROM company;
------------------------------------------
sqlite> SELECT * FROM company
…> WHERE salary<5000 or salary>10000;
------------------------------------------
sqlite> SELECT * FROM company
…> WHERE salary<5000 or salary>10000
…> ORDER BY salary DESC;
练习:创建一个学生成绩的数据表(stduent),里面包含列的字段依次是学号(ID),姓名(Name),成绩(Score),依次完成下面操作:
1)向数据表插入以下数据
ID Name Score
10001 游成伟 88
10002 闵卫 90.5
10005 Jerry 100
10004 孟健 59.5
10003 Tom 99
…
INSERT INTO Student (…) VALUES(…);
2)删除Jerry一条数据
3)修改孟健成绩: 59.5–>95.5
4)排序查询
4 在Qt应用程序中使用Sqlite数据
1)建立Qt应用程序和数据库连接 QSqlDatabase
//添加数据库驱动
QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);
//设置数据库名字(对于sqlite就是数据库文件名)
db.setDatabaseName(“testDB.db”);
//打开数据库
bool ok = db.open();
2)执行SQL语句 QSqlQuery
//创建QSqlQuery对象
QSqlQuery query;
//准备要执行的SQL语句字符串
QString str = QString(“SQL语句”);
//执行sql语句
query.exec(str);
3)保存查询结果集 QSqlQueryModel
//创建QSqlQueryModel对象
QSqlQueryModel *model = new QSqlQueryModel;
//执行SELECT语句并保存结果集到model
model->setQuery(“SELECT语句”);
//将model保存结果显示图形控件(QTableView)上
QTableView *view = new QTableView;
view->setModel(model);
view->show();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)