首页 > 其他分享 >多线程

多线程

时间:2024-10-24 19:20:34浏览次数:3  
标签:QSettings const 函数 void 线程 参数 多线程

一、多线程

1、 复现未响应

使用线程类QThread的睡眠函数可以非常简单且精准的模拟阻塞:

// 强制当前线程睡眠一段时间

// 参数为睡眠的秒数

void QThread::​sleep(unsigned long secs)

2 、创建并启动线程

创建并启动一个子线程的操作步骤如下:

1. 选中项目名称,鼠标右键,点击“添加新文件”。

2. 按照下图所示进行操作。

3. 设置继承结构。

4. 项目管理界面,直接点击“完成”。可以看到对应的文件。

5. 自定义线程类的头文件和源文件还需要修改。

6. 进入自定义线程类的头文件,覆盖基类QThread的run函数。

// 此函数相当于子线程的主函数,调用start函数后,新创建的线程自动调用此函数。

void QThread::​run() [protected virtual]

7. 在run函数的函数体中,编写子线程要执行的逻辑。需要注意的是,子线程不能执行任何UI操作,如果子线程的run函数需要用到UI的相关参数,需要主线程(父对象)给子线程(子对象)传参(成员函数)。

8. 在主线程中创建子线程对象,并调用start函数启动子线程。

// 启动子线程

// 参数:子线程的优先级

void QThread::​start(Priority priority = InheritPriority) [slot]

3 、异步刷新

在实际的开发中,两个线程通常要进行数据交互,相比于5.2节,更常见的场景是异步刷新。异步刷新指的是,子线程执行耗时操作,主线程根据子线程耗时操作的参数在UI进行刷新。

异步刷新问题可以归纳为子线程给主线程传参问题,即子对象给父对象传参——信号槽。

4 、停止线程

停止线程的一些方法:

  • 调用terminate函数

// 强行停止线程,比较危险,不推荐使用

void QThread::​terminate() [slot]

  • 使用标志位

可以在耗时的循环体中添加标志位,通过停止循环间接让run函数执行完,达到停止线程的效果。

二、 数据持久化

数据持久化:将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

之前数据库就是一种数据持久化的方式,但是虽然嵌入式使用的SQLite数据库已经是轻量级数据库,但是相对于其他技术,还是一种比较“重”的数据持久化方式。

Qt中提供比数据库更轻量级的数据持久化方式——QSettings

相关函数如下:

// 构造函数

// 参数1:存储文件的名称,默认为构建目录

// 参数2:存储格式

// 参数3:父对象

QSettings::​QSettings(const QString & fileName, Format format, QObject * parent = 0)

// 设置INI文件的编码,建议使用UTF-8

// 参数:编码字符串

void QSettings::​setIniCodec(const char * codecName)

// 开始存储,相同类型数据建议使用此函数,以数组方式存储

// 参数:数组的名称

void QSettings::​beginWriteArray(const QString & prefix)

// 开始存储,不同类型的数据建议使用此函数(相同类型也可以,但是性能不如上面的好),以组方式存储

// 参数:组的名称

void QSettings::​beginGroup(const QString & prefix)

// 在组中添加键值对

// 参数1:键

// 参数2:值

void QSettings::​setValue(const QString & key, const QVariant & value)

// 结束数组/组的存储

void QSettings::​endArray()

void QSettings::​endGroup()

// 根据键获得值

// 参数1:键

// 参数2:如果取出失败的默认值

// 返回值:值

QVariant QSettings::​value(const QString & key, const QVariant & defaultValue = QVariant()) const

标签:QSettings,const,函数,void,线程,参数,多线程
From: https://blog.csdn.net/weixin_63207763/article/details/143122596

相关文章

  • Linux多线程详解
    概述多线程基本概念在探讨Linux系统的高级特性时,我们首先需要了解多线程这一基础概念。多线程是一种允许多个线程在同一进程中并发执行的技术,旨在提高系统资源利用率和程序响应速度1。与进程不同,线程共享同一进程的地址空间和资源,使得线程间通信更为高效2。Linux系统通......
  • 一个基于队列、多线程的文件转换程序
    importcv2importosimportnumpyasnpimportargparseimportthreadingimportqueueimportloggingfrommultiprocessingimportValue#配置日志记录logging.basicConfig(level=logging.INFO,format='%(asctime)s===%(levelname)s===%(m......
  • C++多线程同步和加锁的方式
    多线程同步和加锁的方式1.互斥锁(Mutex)互斥锁是一种常见的线程同步机制,用于保护共享资源,确保同一时间只有一个线程可以访问该资源。C++标准库提供了std::mutex类来实现互斥锁。std::mutex的lock()成员函数获取锁,使用完毕后调用unlock()释放锁。推荐使用std::lock_guard......
  • 【unity】 Loom实现多线程
    ​通常情况下,unity中在子线程中改变变量的值,但是子线程尚未结束时,主线程无法使用该变量。因此使用Loom作为中介,子线程调用并传值给Loom,Loom调用主线程的API。实现步骤创建Loom空物体,并挂载Loom脚本//Loom.csusingSystem;usingSystem.Collections;usingSystem.Collectio......
  • selenium单例模式下 docker-chrome 多线程并发代码
    最近需要写爬虫,在解决docker-standalone-chrome发现只能有一个chrome被执行。所以写了这个多线程并发控制类来管理。当模板记录下。#!/usr/bin/envpython3importthreadingimporttracebackfromloguruimportloggerfromseleniumimportwebdriverfromselenium.comm......
  • 11-案例:多线程版用户聊天程序
    1.多线程版用户群聊程序的_多用户聊天运行结果2.多线程版用户群聊程序的_服务端代码3.多线程版用户群聊程序的_客户端代码4.多线程版用户群聊程序的_双用户聊天运行结果5.多线程版用户群聊程序的_双用户聊天运行服务端代码6.多线程版用户群聊程序的_双用户聊天运行客户端代码......
  • 【Linux线程】Linux多线程实践:深入生产者消费者模型
    ......
  • 【JavaEE】【多线程】单例模式
    目录一、设计模式1.1单例模式1.1.1饿汉模式1.1.2懒汉模式1.2线程安全问题1.3懒汉模式线程安全问题的解决方法1.3.1原子性问题解决1.3.2解决效率问题1.3.3解决内存可见性问题和指令重排序问题一、设计模式在讲解案例前,先介绍一个概念设计模式:就是大佬们......
  • 多线程(八):阻塞队列 & 生产者消费者模型
    目录1.阻塞队列 2.生产者消费者模型2.1场景举例2.2重要优势2.2.1解耦合 2.2.2削峰填谷2.3付出的代价3.BlockingQueue4.模拟实现阻塞队列4.1wait的注意事项4.2代码实现 1.阻塞队列在数据结构中,我们学习了简单的普通队列,也学习了较为复杂一些......
  • 多线程模块threading
    1.简单例子importthreadingimporttimedefrun(n):print("task",n)time.sleep(2)t1=threading.Thread(target=run,args=("t1",))t2=threading.Thread(target=run,args=("t2",))t1.start()t2.start()2.真使用时需要用类importthreadingcl......