千家信息网

Qt中进程与线程的概念分析

发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,这篇文章主要介绍了Qt中进程与线程的概念分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.进程与线程的概念A.进程的概念a.程序是
千家信息网最后更新 2025年11月15日Qt中进程与线程的概念分析

这篇文章主要介绍了Qt中进程与线程的概念分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一.进程与线程的概念

A.进程的概念
a.程序是计算机存储系统中数据文件
源代码程序--文本文件,描述程序行为和功能
可执行程序--二进制文件,直接加载并执行

进程的概念有两层的概念,在广义上是指程序关于某个数据集合的一次运行活动,而在侠义上指的是程序被加载到内存中执行后得到进程
程序与进程的区别体现在程序是硬盘中静态文件而进程是内存中动态的运行实体
程序与进程的联系
1.一个程序可能对应多个进程--一个程序多次运行,每次运行产生一个进程
2.一个进程可能包含多个程序--一个程序依赖多个其它动态库
B.线程的概念
1.进程内的一个执行单元'
2.操作系统中一个可调度的实体
3.进程中相对独立的一个控制流序列
4.执行时的现场数据和其它调度所需的信息
深入理解线程与进程
1.进程中存在多个线程共享进程资源
2.线程是被调度的执行单元,而进程不是调度单元
3.线程不能脱离进程单度存在,只能依赖于进程运行
4.线程有生命期,有诞生和死亡
5.任意线程都可以创建其它新的线程

二.Qt多线程编程

A.Qt中通过QThread直接支持多线程
1.QThread是一个跨平台的多线程解决方案
2.QThread以简洁易用的方式实现多线程编程

QThread中的关键成员函数
1.void run()--线程体函数,用于定义线程功能(执行流)
2.void start()--启动函数,将线程入口地址设为为run函数
3.void terminate()--强制性结束线程
QThread编程示例

代码示例

#include #include #include class MyThread : public QThread{protected:    void run()    {        qDebug() << objectName() << " : " << "run() begin";        for(int i=0; i<5; i++)        {            qDebug() << objectName() << " : " << i;            sleep(1);        }        qDebug() << objectName() << " : " << "run() end";    }};int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    qDebug() << "main() begin";    MyThread t;    t.setObjectName("t");    t.start();    MyThread tt;    tt.setObjectName("tt");    tt.start();    for(int i=0; i<100000; i++)    {        for(int j=0; j<10000; j++)        {        }    }    qDebug() << "main() end";    return a.exec();}

运行结果

生成该结果的原因主要是因为两个线程是并行运行的
线程的生命周期

三.多线程间的同步

多线程编程的本质有三个方面
1.并发性是多线程的本质
2.在宏观上,所有线程并行执行
3.多喝线程间相互独立,互不干涉

同步的概念--在特殊情况下,控制多线程间的相对执行顺序
QThread类直接支持线程间的同步-bool QThread::wait(unsigned long time=ULONG_MAX)

wait所起的作用是当一个线程结束再进行下一个线程
代码示例

#include #include #include //分3个阶段来计算1-1000的和class Calculator : public QThread{protected:    int m_begin;    int m_end;    int m_result;    void run()    {        qDebug() << objectName() << ": run() begin";        for(int i=m_begin; i<=m_end; i++)        {            m_result += i;            msleep(10);        }        qDebug() << objectName() << ": run() end";    }public:    Calculator(int begin, int end)    {        m_begin = begin;        m_end = end;        m_result = 0;    }    void work()    {        run();    }    int result()    {        return m_result;    }};int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    qDebug() << "main begin";    Calculator cal1(1, 300);    Calculator cal2(301, 600);    Calculator cal3(601, 1000);    cal1.setObjectName("cal1");    cal2.setObjectName("cal2");    cal3.setObjectName("cal3");    cal1.start();    cal2.start();    cal3.start();    cal1.wait();    cal2.wait();    cal3.wait();    int result = cal1.result() + cal2.result() + cal3.result();    qDebug() << "result = " << result;    qDebug() << "main end";    return a.exec();}

运行的结果


感谢你能够认真阅读完这篇文章,希望小编分享的"Qt中进程与线程的概念分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

线程 进程 程序 概念 运行 函数 多个 文件 篇文章 编程 调度 单元 数据 示例 结果 同步 支持 分析 代码 内存 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 高速公路联网系统网络安全管理 公安部 网络安全与执法专业 数据库中哪些字段不能做主键 360郑文彬 网络安全 png转二进制字段在数据库 通信跟网络安全有关系吗 手机服务器压力过大怎么办 怎么登录阿里云数据库 jsp与数据库怎么连接 网络安全法中的数据处理包括 广东工贸大学计算机网络技术 删除mysql数据库字段 东莞支付软件开发公司 软件开发部署计划 关于网络安全的倡议书500字 软件开发专业公务员考试 关于开展全市网络安全检查 开展村村通网络技术培训活动 软件开发与工程师报考时间 csol无法连接到服务器 B S软件开发的过程 两个服务器共享一个数据库 请简述数据库管理的三个阶段 centos服务器登录 什么软件开发效率最好 40岁后还能做软件开发吗 山东德州网络安全培训班 服务器功能及其主要技术要求 全球中小企业有多少数据库 艾尔登法环 服务器断开
0