Qt开发『概念理解』
引言
本文根据 0voice大佬整理汇总 的内容进一步提炼总结而成。感谢 0voice 大佬汇总。
1 在Qt多线程环境中,如何控制信号槽在哪个线程中执行
通过connect方法的第五个参数可以控制信号槽执行所在线程。
connect有三种连接方式,直接连接、队列连接和自动连接
直接连接(Qt::DirectConnection):信号槽在信号发出者所在的线程中执行
队列连接 (Qt::QueuedConnection):信号在信号发出者所在的线程中执行,槽函数在信号接收者所在的线程中执行
自动连接 (Qt::AutoConnection):多线程时为队列连接函数,单线程时为直接连接函数。
2 UDP协议的通信流程
在Qt开发中使用QUdpSocket类进行UDP数据报的发送与接收(IP地址和端口绑定)。其通信流程如下:
- 创建QUdpSocket套接字对象
- 如果需要接收数据,必须绑定端口号
- 发送数据使用writeDatagram方法,接收数据使用readDatagram
3 TCP协议的通信流程
服务器端的通信流程:
- 创建QTcpServer对象
- 监听list(IP地址和端口号)
- 等待客户端连接成功后发送newConnect信号
- 直接在newConnection槽函数当中调用nextPendingConnection函数获取新连接的QTcpSocket对象
- 连接QTcpSocket对象的readRead信号
- 在readRead信号槽中使用read接收数据
- 调用write函数来发送数据
客户端的通信流程:
- 创建QTcpSocket对象
- 当对象与服务器连接成功时会发送connected信号
- 调用connectToHost函数连接服务器(IP地址和端口号)
- connected信号的槽函数开始发送数据
- 使用write发送数据,使用read接收数据
4 信号与槽机制的优缺点
优点:灵活性、松散耦合、类型比较安全
缺点:速度比较慢
5 数据流(QDataStream)与文件流(QTextStream)的区别
数据流:通过数据流可以操作各种数据类型(包括对象、存储到文件中的数据为二进制)
文件流:操作轻量级数据,数据写入文本后是以文本的方式存储展现的
6 C++当中拥有的三个智能指针分别是什么
- shared_ptr:共享指针,同一块内存存储空间每多一个指针指向就计数加1,如果计数变为0则释放内存空间
- unique_ptr:计数只能为1,没有拷贝构造函数
- weak_ptr:指向内存存储空间而没有所有权。只有读权限而没有写权限
7 C++协程
线程分为内核态线程以及用户态线程。
协程的本质是处理自身挂起和恢复的用户态线程,协程的切换要比线程的切换速度更快,适合IO密集型任务。
协程分类:有栈协程(改变函数调用栈。有自己的调用栈,类似于线程的操作)、无栈协程(使用状态机或者闭包进行处理,c++20抛弃此类)
8 互斥锁、读写锁、自旋锁
互斥锁(mute lock):是睡眠等待类型的锁。当线程抢占互斥锁失败后,线程则会陷入休眠状态。优点是节省CPU资源,缺点是休眠唤醒需要消耗额外的时间
读写锁(read-write lock):又称为共享-独占锁,对于临界区区分读写,读共享、写独占。使用场景:多读少写。
自旋锁(spin lock):忙等待(本质就是死循环)。不会引起线程休眠
9 Qt当中的智能指针
- QSharedPointer:对拥有的内存资源的引用计数,引用计数下降到0时释放内存资源
- QScopedPointer:内存数据只在一个地方被使用
- QPointer:指向QObject以及派生类的对象。超出作用域的时候并不会释放所指向的内存对象
10 Qt连接MySQL数据库原理机制以及方法
- 直接通过MySQL驱动加载数据库技术
- 通过ODBC连接MySQL数据库技术
11 Qt中多线程使用方法
方法一:①创建一个类从QThread类派生②在子线程类中重写 run 函数, 将处理操作写入该函数中 ③在主线程中创建子线程对象, 启动子线程, 调用start()函数
方法二:①将业务处理抽象成一个业务类, 在该类中创建一个业务处理函数②在主线程中创建一QThread类对象 ③在主线程中创建一个业务类对象 ④将业务类对象移动到子线程中 ⑤在主线程中启动子线程 ⑥通过信号槽的方式, 执行业务类中的业务处理函数