QT 笔记5 |Qt多线程(QThread)

2023-05-16

一 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

  1. 删除数据表
    语法:
    DROP TABLE 表名;
    注:慎用,数据表一旦删除,里面所包含的数据也将随之消失!
    eg:
    sqlite> .table
    company student
    sqlite> DROP TABLE student;
    sqlite> .table
    company

  2. 向数据表插入数据
    语法:
    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);

  3. 从数据表中删除数据
    语法:
    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=‘江南’;

  4. 修改数据表中已存在的数据
    语法:
    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;

  5. 查询数据表中的数据
    语句:
    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(使用前将#替换为@)

QT 笔记5 |Qt多线程(QThread) 的相关文章

  • 【openCV踩坑日记】人工数据集Synthetic Shapes dataset的生成方法

    1 为什么要介绍这个方法 xff1f 2018年的时候 xff0c D DeTone等人发表了Self Supervised Interest Point Detection and Description xff0c 提出了一种特征提取S
  • 【SLAM】ORB-SLAM3解析——综述(1)

    之前学习VINS和LIO SAM的时候都是代码流 xff0c 不是很重视看论文 xff0c 现在有空学ORB SLAM3了 xff0c 这一次 xff0c 先看一下论文 考虑到边上班边学 xff0c 更新的会比较慢 看完论文之后 xff0c
  • 【SLAM】LVI-SAM解析——综述

    LVI SAM可以认为是LIO SAM和VINS MONO的合体 xff0c 在此基础上的修改不大 github xff1a https github com TixiaoShan LVI SAM paper LVI SAM Tightly
  • 【SLAM】DM-VIO(ros版)安装和论文解读

    1 dm vio的安装 进入官方链接 xff0c 基本上就是按照readme的操作来 xff1a 下载代码 xff1a git clone https github com lukasvst dm vio git 安装gtsam xff1a
  • 【SLAM】SVO2.0编译运行和论文代码解读

    SVO2是我遇到的最难编译的代码了 xff0c 毕竟公开版本怎么能放最好的代码呢 xff0c 搞了快一个星期 xff0c 终于跑起来了 github xff1a GitHub uzh rpg rpg svo pro open 论文 xff1
  • 【工具篇】postman的完全使用,全是干货

    目录 一 x1f347 GET请求 二 x1f348 POST请求 三 x1f349 PUT请求 四 x1f34a DELETE请求 五 x1f34b Headers 六 x1f34c 认证 xff08 1 xff09 基本认证 xff1a
  • GPS全球定位系统构成及原理

    GPS全球定位系统构成及原理 全球定位系统 GPS 是本世纪70年代由美国陆海空三军联合研制的新一代空间卫星导航定位系统 其主要目的是为陆 海 空三大领域提供实时 全天候和全球性的导航服务 xff0c 并用于情报收集 核爆监测和应急通讯等一
  • Visual C++设计UDP协议通讯示例

    下载本文源代码 一 绪言 UDP是一种面向非连接 xff0c 不可靠的通讯协议 xff0c 相对于 TCP来说 xff0c 虽然可靠性不及 xff0c 但传输效率较高 所以在网络上仍有很大的用途 这几日需要了解下udp通讯的过程 xff0c
  • 树莓派控制舵机云台

    文章目录 学习记录舵机代码分析 学习记录 手上有一套电赛时候买的舵机云台 扭矩15KG 型号为LD 1501MG 舵机 两个LD 1501MG舵机角度范围都是180度 控制的PWM波周期为20ms 角度与正脉冲宽度映射如下所示 0 5ms
  • jetson nano 编译pyrealsense2 运行t265

    在win10 的环境下 xff0c 安装pyrealsense2 xff0c 只需要简单的pip就可以了 xff0c 没想到在jetson nano下却花了那么多时间和精力 其实解决方案网上都有 xff0c 但是比较零碎 xff0c 只能遇
  • openmv探索_4_AprilTag标记追踪

    原理及代码 AprilTag标记追踪 空间坐标系的建立 以镜头中心为坐标系原点 xff0c 建立空间坐标系 图2 1 空间坐标系 旋转角度 xff08 参考系是上图中的坐标系 xff09 1 初始状态 图3 1 物体摆放的初始位置 上图的
  • Xsens MTi传感器 ROS下配置

    Xsens MTi传感器 ROS 1 概述2 MTI设置 MTmanager3 ROS下信息发布 MTSDK4 找不到设备 xff15 参考链接 xff16 延伸阅读传感器配置节点程序分析经典SLAM 1 概述 主要介绍Ubuntu下对Xs
  • 雷达点云 PointCloud2 格式转换

    雷达点云 sensor msgs PointCloud2 pcl PointCloud 数据格式转换参考代码 官方对点云格式的介绍 xff0c 主要有四种 xff0c sensor msgs PointCloud已经弃用 参考 sensor
  • Gmapping 之安装与配置

    Gmapping 之安装与配置 1 概述2 安装2 1 github仓库 3 运行3 1 运行截图3 2 重采样时的提示信息3 3 tf树 96 rosrun rqt tf tree rqt tf tree 96 3 4 所有的坐标变换信息
  • Gmapping Dropped 100.00% of messages so far 解决办法

    Dropped 100 00 of messages so far解决办法 概述显示tf树正常情况报错情况参考链接Gmapping 概述 运行Gmappping时出现错误提示 xff0c 其他参数 xff1a 话题等都设置正确了 xff0c
  • LOAM SLAM安装与配置

    LOAM SLAM安装与配置 1 概述2 安装3 运行4 结果5 其他6 参考链接 1 概述 简单介绍LOAM SLAM的安装与配置 xff0c 希望能帮助大家 xff0c 同时供自己以后参考 2 安装 运行LOAM需要PCL等库支持 xf
  • 什么是MSB、LSB,什么是大端、小端,区别是什么?

    MSB是Most Significant Bit的缩写 xff0c 最高有效位 在二进制数中 xff0c MSB是最高加权位 与十进制数字中最左边的一位类似 通常 xff0c MSB位于二进制数的最左侧 xff0c LSB位于二进制数的最右
  • ROS报错 cant locate node 解决办法

    ROS报错 can 39 t locate node 解决办法 1 概述2 原因3 解决办法4 其他 1 概述 ROS突然出现不能运行节点的问题 xff0c 这里简单介绍一下自己的解决办法 这个方法还是有缺陷 xff0c 更新方法在ROS编
  • ubuntu 开机后 按键 鼠标不能用

    ubuntu 开机后 按键 鼠标不能用 1 现象2 解决办法3 参考链接 1 现象 版本ubuntu 1804安装bumblebee后 xff0c 重启机器出现不能使用鼠标 键盘的现象 xff0c 具体点就是 xff0c 只有开机后的桌面显
  • 相机标定之使用ROS节点程序

    相机标定之使用ROS节点程序 1 概述2 准备3 步骤4 相关链接 1 概述 简单介绍如何使用ROS节点程序进行针孔模型相机标定的步骤 xff0c 供自己以后参考 xff0c 同时希望给大家带来帮助 2 准备 提前准备好棋盘格并打印出来 x

随机推荐

  • 相机标定之使用Matlab工具箱

    相机标定之使用Matlab工具箱 1 概述2 准备3 步骤4 相关链接 1 概述 简单介绍如何使用Matlab进行针孔模型相机标定的步骤 xff0c 供自己以后参考 xff0c 同时希望给大家带来帮助 2 准备 提前准备好棋盘格并打印出来
  • QT安装教程

    QT安装教程 1 概述2 下载安装2 1 下载2 2 安装2 3 安装配置其他环境2 4 安装成功2 5 问题及解决 3 参考链接 1 概述 简单介绍如何在Ubuntu下安装QT xff0c 希望能够帮助大家 xff0c 同时给自己一个参考
  • C++面向过程

    参考文档 xff1a C 43 43 教程 C 43 43 简介 概述 C 43 43 是一种静态类型的 编译式的 通用的 大小写敏感的 不规则的编程语言 xff0c 支持过程化编程 面向对象编程和泛型编程 C 43 43 是 C 的一个超
  • vector 指针 的指针

    vector 不能用指针 xff0c 用指针 xff0c push back会报错 xff0c size 也不对 vector本身用对象 xff0c 内容 简化为A 可以用指针 xff0c 当指针对象中还有指针B时 xff0c 就要用new
  • cmake find_package opencv 找不到

    目录 cmakelist设置方法ok 环境变量设置方法ok linux写法 cmakelists txt完整示例 find opencv lib find package OpenCV REQUIRED NO MODULE should b
  • liveplayer

    npm i 64 liveqing liveplayer S lt template gt lt div class 61 34 live player 34 gt lt div style 61 34 width 640px height
  • DLT algorithm needs at least 6 points for pose estimation from 3D-2D point correspondences. (expecte

    DLT algorithm needs at least 6 points for pose estimation from 3D 2D point correspondences expected 39 count gt 61 6 39
  • 关于OSD

    OSD的主要实现方法和类型 目前有两种主要的OSD实现方法 xff1a 外部OSD发生器与视频处理器间的叠加合成 xff1b 视频处理器内部 支持OSD xff0c 直接在视频缓存内部叠加OSD信息 外部OSD发生器与视频处理器间的叠加合成
  • RTK使用笔记-千寻CORS模式

    一 千寻CORS模式 与基站 43 接收机1对1相比 xff0c 优点为携带方便 xff0c 也不用考虑10公里移动基站问题 xff1b 缺点为第一千寻CORS模式有自己基站涵盖范围 xff0c 所以需要提前确定好范围 xff08 下文有介
  • c/c++语言实现登陆界面

    C C 43 43 语言实现登陆界面 整体功能介绍 实现一个登陆界面 1 输出一个登陆界面 2 用户名能够实现邮箱验证 xff0c regex库 xff0c 密码要不可见 3 进度条的模拟实现 4 音乐播放 分步实现 1 输出一个登陆界面
  • _getch()函数的介绍

    getch 函数的介绍及实例演示 我们一般所使用的 getchar 函数在读入一个字符时必须按一下 Enter 键 xff0c 该代码才会继续运行 但是 getch 函数读入一个字符时 不用 enter 代码会继续跑 xff1b 最简单使用
  • 嵌入式常见面试题

    嵌入式LINUX常见面试问题总结 声明 xff1a 本文是将常见的面试问题进行汇总 xff0c 但大多数问题也是开发中较为常见的技术盲区 xff01 在此进行了汇总 xff0c 以便后续进行参考 xff01 所有的答案部分是自己编写 xff
  • LINUX基础试题大全(1)

    说明 xff1a 此文章由于题数庞大 xff0c 为方便阅读本人将其分为四篇文章为大家分享 xff01 答案会今后不断进行更新 xff01 LINUX基础试题大全 xff08 1 xff09 填空题题 LINUX基础试题大全 xff08 2
  • C语言 | 深入学习数组

    说明 xff1a 本文主要讨论一维数组 xff0c 适宜程度 xff1a 对C语言初步认识及想深入学习者 1 从编译器角度理解数组 从编译器角度理解来讲 xff0c 数组也是一个变量 xff0c 和普通的变量没有本质的区别 变量的本质指的是
  • C语言 结构体 联合体 | 嵌套使用

    一 简单的实例分析 题目 xff1a 获取0x12345678各个字节 答案 xff1a span class token comment 方法一 span span class token macro property span clas
  • Linux 网络编程笔记3 | 内存 系统调用

    七 内存 1 虚拟内存 物理内存 半导体内存和换页文件 虚拟内存 xff1a 地址空间 xff0c 虚拟的存储区域 xff0c 应用程序所访问的都是虚拟内存 物理内存 xff1a 存储空间 xff0c 实际的存储区域 xff0c 只有系统内
  • 树莓派替代品

    51单片机 转载于 https www cnblogs com wanghuaqiang p 11481958 html
  • C++ 笔记10 | 多态(polymorphic)

    span class token variable eg 实现图形库 xff0c 用于显示各种图形 span span class token variable 图形基类 span span class token punctuation
  • QT 笔记3 | Qt设计师使用 Qt创造器使用

    六 Qt设计师使用 designer 案例1 xff1a 使用设计师重构加法计算器 1 创建工程目录 mkdir Calculator2 2 进入工程目录 xff0c 执行 designer 启动设计师 1 xff09 在新建窗体界面 xf
  • QT 笔记5 |Qt多线程(QThread)

    一 Qt多线程 QThread 1 创建线程方法1 xff1a QObject moveToThread class Myclass public QObject Q OBJECT public slots void func void 耗