使用qt实现多线程编程

article/2025/9/16 5:43:36

目录

1、线程基础

1.1、GUI线程与工作线程

1.2、数据的同步访问

2、QT多线程简介

3、QThread线程类

4、创建并启动线程


        QThread类提供不依赖于平台的管理线程的方法。一个QThread类的对象管理一个线程,一 般从QThread继承一个自定义类,并重定义虚函数run(),在run()函数里实现线程需要完成的任务。

1、线程基础

1.1、GUI线程与工作线程

        每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。

        所以,一些GUI显示的工作只能放在主线程,不能放在工作线程中。

1.2、数据的同步访问

        每个线程都有自己的栈,因此每个线程都有自己的调用历史和本地变量。线程共享相同的地址空间。

2、QT多线程简介

        QT通过三种形式提供了对线程的支持,分别是平台无关的线程类、线程安全的事件投递、跨线程的信号-槽连接。

QT中线程类包含如下:

        1)QThread 提供了跨平台的多线程解决方案;

        2)QThreadStorage 提供逐线程数据存储

        3)QMutex 提供相互排斥的锁,或互斥量;QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁;

        4)QReadWriterLock 提供了一个可以同时读操作的锁;QReadLocker与QWriteLocker 自动对QReadWriteLock 加锁与解锁;

        5)QSemaphore 提供了一个整型信号量,是互斥量的泛化;

        6)QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。

3、QThread线程类

        将应用程序的线程称为主线程,额外创建的线程称为工作线程。一般在主线程里创建工作线程,并调用start()开始执行工作线程的任务。

        QThread类的主要接口函数、信号和槽函数见下表:

关键函数说明: 

1)启动关闭函数

        QThread是Qt线程中有一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过start()函数来调用run函数。

        start()会在内部调用run()函数,进入工作线程的事件循环,在run()函数里调用exit()或quit()可以结束线程的事件循环,或在主线程里调用terminate() 强制结束线程。

void run() 函数是线程体函数,用于定义线程的功能。
void start() 函数是启动函数,用于将线程入口地址设置为run函数。
void terminate() 函数用于强制结束线程,不保证数据完整性和资源释放。
void wait() 阻塞调用的线程,直到其它线程执行完毕(或者直到指定的时间过去)。int exec() 进入事件循环并等待直到调用exit(),返回值是通过调用exit()来获得,如果调用成功则返回0。
void quit() 通知线程事件循环退出,返回0表示成功,相当于调用了QThread::exit(0)。

        QCoreApplication::exec()总是在主线程(执行main()的线程)中被调用,不能从一个QThread中调用。在GUI程序中,主线程也称为GUI线程,是唯一允许执行GUI相关操作的线程。另外,必须在创建一个QThread前创建QApplication(or QCoreApplication)对象。

void terminate(); 结束线程,线程是否立即终止取决于操作系统。

        线程被终止时,所有等待该线程Finished的线程都将被唤醒。terminate是否调用取决于setTerminationEnabled ( bool enabled = true )开关。

2)信号量

        当线程启动和结束时,QThread会发送信号started()和finished(),可以使用isFinished()和isRunning()来查询线程的状态。从Qt4.8起,可以释放运行刚刚结束的线程对象,通过连接finished()信号到QObject::deleteLater()槽。

void started() 线程开始执行之前发射,也就是run()函数被调用之前 
void finished() 线程就要结束时发射

3)其它

        静态函数:

currentThreadId() // 返回标识当前正在执行的线程的ID 
currentThread() // 返回标识当前正在执行的线程的指针

        设置线程名称,如果不调用setObjectName(),线程的名称将是线程对象的运行时类型(QThread子类的类名):

setObjectName() // 在启动线程之前调用,用于设置线程的名称

4、创建并启动线程

执行步骤:

        1)自定义类继承自QThread;

        2)实现run()函数;

        3)主函数中定义类对象并调用start()。

#include <QCoreApplication>
#include <QThread>
#include <QDebug>class ThreadTest: public QThread
{
public:ThreadTest() {}void run(){qDebug()<<objectName()<<" : run";sleep(2);qDebug()<<objectName()<<" : exit";}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);ThreadTest threada;threada.setObjectName(ThreadTest);threada.start();qDebug()<<"threada end";return a.exec();
}

结果:

传送门:qt多线程系列文章目录

1、QT多线程编程详解(线程优先级):

QT多线程编程详解_coolboywjun的专栏-CSDN博客_qt多线程


http://chatgpt.dhexx.cn/article/RnXb0HnA.shtml

相关文章

ZMQ之多线程编程

使用ZMQ进行多线程编程&#xff08;MT编程&#xff09;将会是一种享受。在多线程中使用ZMQ套接字时&#xff0c;你不需要考虑额外的东西&#xff0c;让它们自如地运作就好。 使用ZMQ进行多线程编程时&#xff0c;不需要考虑互斥、锁、或其他并发程序中要考虑的因素&#xff0c;…

C++之多线程编程

一、并发的实现 1.多进程并发主要解决进程间通信的问题 ①同一电脑上&#xff1a;管道、文件、消息队列、内存共享。 ②不同电脑上&#xff1a;socket网络通信。 2. 单进程中的多个线程并发&#xff08;一个主线程多个子线程实现并发&#xff09; ①一个进程中的所有线程共享内…

Springboot异步多线程编程

文章目录 一、基础知识二、什么时候用同步&异步三、什么时候需要使用多线程四、springboot异步多线程编程实现 一、基础知识 同步&#xff1a;同步就是指一个进程在执行某个请求的时候&#xff0c;若该请求需要一段时间才能返回信息&#xff0c;那么这个进程将会一直等待下…

【线程】多线程编程

目录 一、概念 1.进程与线程的区别是&#xff1f;&#xff08;常问&#xff09; 2.线程与fork系统调用 3.线程的优缺点 4.线程的实现方式 二、线程函数 1.pthread_create 2.pthread_exit 3.pthread_join 4.pthread_cancel 三、线程的使用 1.线程的基本操作 2.并发…

多线程编程及线程间通信机制

对进程线程的印象还是比较好的,这对于学习C高级的朋友是非常重要的,怎样更快的学习到线程的具体使用呢?最好的办法自然是练习再练习,然后还要看很多的代码才是,之前又听说了一个IT同行过劳死,特别的提醒广大的IT从业者,要注意合理的作息习惯,健康才是最重要的,下面结合…

多线程编程

多线程指的是一个程序中包含两个或者两个以上的线程&#xff0c;多线程的提出是为提高代码的执行效率&#xff0c;这就好比工厂中的流水线&#xff0c;只有一条称为单线程&#xff0c;有多条流水线就称为多线程。多线程提高效率的同时由于并发执行的不确定性&#xff0c;导致出…

两种 C++ 多线程编程方式,看完不懂打我...

多线程在实际编程中的重要性不言而喻&#xff0c;对 C 而言&#xff0c;当我们需要使用多线程时&#xff0c;有多种方案可供选择。比如 POSIX 线程 pthread、boost::thread 库、C11 开始支持的 std::thread 库&#xff0c;以及其他一些第三方库 libdispatch&#xff08;GCD&…

ARP攻击模拟工具

以下是本人平时的一些小作品&#xff0c;特此和大家一起分享... ARP攻击模拟工具 第一代 说明&#xff1a; 实现模拟以太网的ARP欺骗攻击和IP地址冲突攻击。 此为本人早期作品&#xff0c;固比较简陋和不完善&#xff0c;漏洞及错误之处可能较多请多多包涵&#xff01; 开发环…

ARP断网攻击

在之前的文章当中&#xff0c;我已经向大家介绍了关于ARP的欺骗原理。再进一步&#xff0c;将其中的原理运用到实战中去&#xff0c;又会有什么效果呢&#xff1f;ARP又可以给我们带来哪些具体的作用呢&#xff1f;毕竟实践要来支撑&#xff0c;我们之前学过的ARP欺骗原理。 我…

ARP-欺骗攻击

测试环境&#xff08;kali:192.168.189.7 win7:192.168.189.6 网关:192.168.189.2&#xff09; arpspoof -i eth0 -t 192.168.189.6 192.168.189.2 &#xff08;目标地址网关地址&#xff09; 接收获取的信息 随意登陆一个网站&#xff0c;可发现用户名及密码已被获取。可以…

ARP攻击原理及解决方法,很实用

故障原因】 局域网内有人使用ARP欺骗的木马程序&#xff08;比如&#xff1a;传奇盗号的软件&#xff0c;某些传奇外挂中也被恶意加载了此程序&#xff09;。 【故障原理】 要了解故障原理&#xff0c;我们先来了解一下ARP协议。 在局域网中&#xff0c;通过ARP协议来完成I…

ARP攻击怎么解决最安全

ARP攻击是指攻击者通过伪造网络中的ARP协议数据包&#xff0c;欺骗其他计算机的网络通信&#xff0c;从而实现中间人攻击等目的。 下面是ARP攻击的解决方法&#xff1a; 静态ARP表绑定MAC地址&#xff1a;在网络管理员的控制下&#xff0c;将主机的IP地址与MAC地址进行绑定&am…

ARP攻击及原理

ARP攻击原理:但凡局域网内存在arp攻击&#xff0c;说明网络存在“中间人” 1.PC1需要跟PC2通信&#xff0c;通过ARP请求包询问PC2的MAC地址&#xff0c;由于采用广播的形式&#xff0c;所以交换机会将ARP请求包从接口PC1广播到PC2和PC3。(注&#xff1a;交换机收到广播/组播/未…

ARP攻击、欺骗及防御

一、广播与广播域概述 1、广播与广播域 广播&#xff1a;将广播地址做为目的地址的数据帧。 广播域&#xff1a;网络中能接收到同一个广播所有节点的集合。 2、MAC地址广播 广播地址为FF-FF-FF-FF-FF-FF 3、IP地址广播 1&#xff09;255.255.255.255 2&#xff09;广播…

ARP攻击原理和kali实现ARP攻击

目录 一、ARP协议和ARP攻击1.ARP协议2.利用Wireshark分析ARP数据包3.ARP攻击 二、kali实现ARP攻击和ARP欺骗1.实验过程2.问题记录T_T 一、ARP协议和ARP攻击 1.ARP协议 ARP协议&#xff0c;地址解析协议&#xff08;Address Resolution Protocol&#xff09;&#xff0c;用来实…

怎么处理ARP攻击

ARP故障说明: ping 的时候可能好久才能接收到一个响应&#xff0c;或者说干脆就Ping不通。网络时好时坏&#xff0c;通过ARP -a命令不能看到同网段的在线用户&#xff0c;但是net view 可以看到全网开放共享的电脑名&#xff0c;这时候就需要注意了&#xff0c;可能是ARP攻击。…

网络安全--ARP攻击原理与防护

目录 一.ARP的原理 二.ARP攻击现象及危害 三.ARP攻击的原理 四.ARP防护 在局域网当中&#xff0c;有一个协议由于它的特性一旦遭受攻击就非常麻烦。首先是它的攻击门槛比较低&#xff0c;找到一些小工具就能实现攻击&#xff0c;而且危害极大。这个协议就是ARP协议。 ARP攻击是…

渗透技术——ARP攻击

Part 1: ARP攻击介绍 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是一个位于TCP/IP协议栈中的底层协议&#xff0c;负责将某个IP地址解析成对应的MAC地址。而ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗&#xff0c;能够在网络中产生…

Linux操作系统及其发行版本

文章目录 Linux是什么Liunx与WindowsLinux的发行版本1. Debian系列&#xff1a;2. Slackware系列&#xff1a;3. Redhat系列&#xff1a;4. 其他发行版本&#xff1a; Linux是什么 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、…

linux查看系统版本命令

*一、查看Linux系统发行版本 * 命令1&#xff1a;lsb_release -a 该命令适用于所有Linux系统&#xff0c;会显示出完整的版本信息&#xff0c;包括Linux系统的名称&#xff0c;如Debian、Ubuntu、CentOS等&#xff0c;和对应的版本号&#xff0c;以及该版本的代号&#xff0c…