Qt开发『概念理解』

引言

本文根据 0voice大佬整理汇总 的内容进一步提炼总结而成。感谢 0voice 大佬汇总。

1 在Qt多线程环境中,如何控制信号槽在哪个线程中执行

通过connect方法的第五个参数可以控制信号槽执行所在线程。

connect有三种连接方式,直接连接、队列连接和自动连接

  • 直接连接(Qt::DirectConnection):信号槽在信号发出者所在的线程中执行

  • 队列连接 (Qt::QueuedConnection):信号在信号发出者所在的线程中执行,槽函数在信号接收者所在的线程中执行

  • 自动连接 (Qt::AutoConnection):多线程时为队列连接函数,单线程时为直接连接函数。

2 UDP协议的通信流程

在Qt开发中使用QUdpSocket类进行UDP数据报的发送与接收(IP地址和端口绑定)。其通信流程如下:

  1. 创建QUdpSocket套接字对象
  2. 如果需要接收数据,必须绑定端口号
  3. 发送数据使用writeDatagram方法,接收数据使用readDatagram

3 TCP协议的通信流程

服务器端的通信流程:

  1. 创建QTcpServer对象
  2. 监听list(IP地址和端口号)
  3. 等待客户端连接成功后发送newConnect信号
  4. 直接在newConnection槽函数当中调用nextPendingConnection函数获取新连接的QTcpSocket对象
  5. 连接QTcpSocket对象的readRead信号
  6. 在readRead信号槽中使用read接收数据
  7. 调用write函数来发送数据

客户端的通信流程:

  1. 创建QTcpSocket对象
  2. 当对象与服务器连接成功时会发送connected信号
  3. 调用connectToHost函数连接服务器(IP地址和端口号)
  4. connected信号的槽函数开始发送数据
  5. 使用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数据库原理机制以及方法

  1. 直接通过MySQL驱动加载数据库技术
  2. 通过ODBC连接MySQL数据库技术

11 Qt中多线程使用方法

  • 方法一:①创建一个类从QThread类派生②在子线程类中重写 run 函数, 将处理操作写入该函数中 ③在主线程中创建子线程对象, 启动子线程, 调用start()函数

  • 方法二:①将业务处理抽象成一个业务类, 在该类中创建一个业务处理函数②在主线程中创建一QThread类对象 ③在主线程中创建一个业务类对象 ④将业务类对象移动到子线程中 ⑤在主线程中启动子线程 ⑥通过信号槽的方式, 执行业务类中的业务处理函数


Qt开发『概念理解』
http://example.com/2022/01/13/Qt常见面试题/
作者
DustWind
发布于
2022年1月13日
许可协议