做网站tt0546/网页代码大全

做网站tt0546,网页代码大全,创建自己的网站需要准备什么,全心代发17做网站在Qt C开发中,进程(Process)和线程(Thread)是两种不同的并发模型,各有适用场景和实现方式。以下是详细对比和实际开发中的用法总结: 一、进程(Process) 进程是操作系统资…

在Qt C++开发中,进程(Process)和线程(Thread)是两种不同的并发模型,各有适用场景和实现方式。以下是详细对比和实际开发中的用法总结:


一、进程(Process)

进程是操作系统资源分配的基本单位,每个进程拥有独立的地址空间、文件描述符、环境变量等。进程间通信(IPC)需要显式机制。

Qt中的进程管理(QProcess类)
  1. 启动外部程序

    #include <QProcess>QProcess process;
    process.start("ls", QStringList() << "-l" << "/"); // 启动ls -l /// 等待完成(阻塞)
    if (process.waitForFinished()) {qDebug() << "Output:" << process.readAllStandardOutput();
    }
    
  2. 异步处理进程输出

    QProcess *process = new QProcess;
    connect(process, &QProcess::readyReadStandardOutput, [process]() {qDebug() << "Output:" << process->readAllStandardOutput();
    });
    process->start("ping", QStringList() << "www.qt.io");
    
  3. 进程间通信(IPC)

    • 共享内存(QSharedMemory
      // 写入进程
      QSharedMemory sharedMem("MySharedMemory");
      sharedMem.create(1024);
      sharedMem.lock();
      memcpy(sharedMem.data(), "Hello from Process 1", 20);
      sharedMem.unlock();// 读取进程
      QSharedMemory sharedMem("MySharedMemory");
      if (sharedMem.attach()) {sharedMem.lock();qDebug() << "Data:" << (char*)sharedMem.data();sharedMem.unlock();
      }
      
    • 本地套接字(QLocalSocket/QLocalServer
      // 服务端
      QLocalServer server;
      server.listen("MyLocalSocket");
      connect(&server, &QLocalServer::newConnection, [&]() {QLocalSocket *socket = server.nextPendingConnection();socket->write("Hello from server!");
      });// 客户端
      QLocalSocket socket;
      socket.connectToServer("MyLocalSocket");
      connect(&socket, &QLocalSocket::readyRead, [&]() {qDebug() << "Received:" << socket.readAll();
      });
      

二、线程(Thread)

线程是CPU调度的基本单位,同一进程内的线程共享地址空间和资源。Qt通过QThread提供线程支持,需注意线程安全。

Qt中的线程实现
  1. 继承QThread

    class WorkerThread : public QThread {Q_OBJECTvoid run() override {// 耗时操作(如计算)emit resultReady(result);}
    signals:void resultReady(int);
    };// 使用线程
    WorkerThread *thread = new WorkerThread;
    connect(thread, &WorkerThread::resultReady, this, &MainWindow::handleResult);
    thread->start();
    
  2. 使用moveToThread(更推荐)

    class Worker : public QObject {Q_OBJECT
    public slots:void doWork() {// 耗时操作emit resultReady(result);}
    signals:void resultReady(int);
    };// 主线程中
    QThread *thread = new QThread;
    Worker *worker = new Worker;
    worker->moveToThread(thread);
    connect(thread, &QThread::started, worker, &Worker::doWork);
    connect(worker, &Worker::resultReady, this, &MainWindow::updateUI);
    thread->start();
    
  3. 线程池(QThreadPoolQtConcurrent

    #include <QtConcurrent>
    void processImage(const QImage &image) {// 图像处理
    }// 提交任务到线程池
    QFuture<void> future = QtConcurrent::run(processImage, image);
    QFutureWatcher<void> watcher;
    connect(&watcher, &QFutureWatcher<void>::finished, this, []() {qDebug() << "Task completed";
    });
    watcher.setFuture(future);
    

三、进程 vs 线程对比

特性进程线程
资源隔离独立地址空间,安全性高共享进程资源,需同步机制
创建开销高(需分配独立资源)低(共享进程资源)
通信方式IPC(管道、共享内存、套接字等)共享内存、信号槽、互斥锁等
容错性一个进程崩溃不影响其他进程线程崩溃可能导致整个进程终止
适用场景需要高隔离性(如安全沙箱、独立服务)需要高效协作(如并行计算、异步任务处理)

四、实际开发建议

  1. 选择进程的场景

    • 需要运行第三方程序(如调用外部工具)。
    • 高安全性需求(如支付模块隔离)。
    • 利用多核CPU且任务相互独立。
  2. 选择线程的场景

    • 频繁数据共享(如图像处理、实时通信)。
    • 避免阻塞主线程(如GUI应用的耗时计算)。
    • 轻量级任务并行(如批量文件处理)。
  3. 通用原则

    • 避免直接跨线程操作对象:通过信号槽通信(使用Qt::QueuedConnection)。
    • 资源管理:确保对象在正确的线程中创建和销毁(如使用QObject::deleteLater)。
    • 同步机制:对共享资源使用QMutexQReadWriteLock等。

五、示例场景

场景1:多进程渲染(使用QProcess
// 启动多个渲染进程
QList<QProcess*> processes;
for (int i = 0; i < 4; ++i) {QProcess *process = new QProcess;process->start("render_tool", QStringList() << "--input" << "scene.xml" << "--output" << QString("output_%1.png").arg(i));processes.append(process);
}// 等待所有进程完成
for (auto process : processes) {process->waitForFinished();qDebug() << "Process" << process->pid() << "exited with code" << process->exitCode();
}
场景2:多线程图像处理(使用QtConcurrent
// 批量处理图片
QList<QImage> images = loadImages();// 使用线程池并行处理
QFuture<void> future = QtConcurrent::map(images, [](QImage &img) {processImage(img); // 每个图像在独立线程处理
});// 显示进度
QFutureWatcher<void> watcher;
connect(&watcher, &QFutureWatcher<void>::progressValueChanged, [](int progress) {qDebug() << "Progress:" << progress << "%";
});
watcher.setFuture(future);

通过合理选择进程和线程模型,可以在保证程序稳定性和安全性的同时,充分利用多核CPU资源,提升应用性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙开发】OpenHarmony调测工具hdc使用教程(设备开发者)

00. 目录 文章目录 00. 目录01. OpenHarmony概述02. hdc简介03. hdc获取04. option相关的命令05. 查询设备列表的命令06. 服务进程相关命令07. 网络相关的命令08. 文件相关的命令09. 应用相关的命令10. 调试相关的命令11. 常见问题12. 附录 01. OpenHarmony概述 OpenHarmony是…

手写简易Tomcat核心实现:深入理解Servlet容器原理

目录 一、Tomcat概况 1. tomcat全局图 2.项目结构概览 二、实现步骤详解 2.1 基础工具包&#xff08;com.qcby.util&#xff09; 2.1.1 ResponseUtil&#xff1a;HTTP响应生成工具 2.1.2 SearchClassUtil&#xff1a;类扫描工具 2.1.3 WebServlet&#xff1a;自定义注解…

【Java开发指南 | 第三十四篇】IDEA没有Java Enterprise——解决方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 1、新建Java项目2、单击项目名&#xff0c;并连续按两次shift键3、在搜索栏搜索"添加框架支持"4、勾选Web应用程序5、最终界面6、添加Tomcat 1、新建Java项目 2、单击项目名&#xff0c;并连续按两次…

在MATLAB中实现PID控制仿真

在MATLAB中实现PID控制仿真可以通过代码编程或Simulink图形化建模两种方式完成。以下是两种方法的详细操作步骤和示例&#xff1a; 方法1&#xff1a;使用MATLAB脚本编程&#xff08;基于控制系统工具箱&#xff09; 步骤1&#xff1a;定义被控对象的数学模型 假设被控对象是…

蓝桥杯历年真题题解

1.轨道炮&#xff08;数学模拟&#xff09; #include <iostream> #include <map> using namespace std; const int N1010; int x[N],y[N],v[N]; char d[N]; int main() {int n;int ans-100;cin>>n;for(int i1;i<n;i)cin>>x[i]>>y[i]>>v…

Pytorch的一小步,昇腾芯片的一大步

Pytorch的一小步&#xff0c;昇腾芯片的一大步 相信在AI圈的人多多少少都看到了最近的信息&#xff1a;PyTorch最新2.1版本宣布支持华为昇腾芯片&#xff01; 1、 发生了什么事儿&#xff1f; 在2023年10月4日PyTorch 2.1版本的发布博客上&#xff0c;PyTorch介绍的beta版本…

阿里千问大模型(Qwen2.5-VL-7B-Instruct)部署

参考链接 知乎帖子 B站视频 huggingface 镜像网站&#xff08;不太全&#xff0c;比如 Qwen/Qwen2.5-VL-7B-Instruct就没有&#xff09; huggingface 5种下载方式汇总 通过huggingface-cli下载模型 不一样的部分是预训练权重的下载和demo 首先安装huggingface_hub pip insta…

Jenkins在Windows上的使用(二):自动拉取、打包、部署

&#xff08;一&#xff09;Jenkins全局配置 访问部署好的Jenkins服务器网址localhost:8080&#xff0c;完成默认插件的安装后&#xff0c;接下来将使用SSH登录远程主机以实现自动化部署。 1. 配置插件 选择dashboard->Manage Jenkins->plugins 安装下面两个插件  …

群晖DS 223 Docker:开启私有云

群晖DS 223 Docker&#xff1a;开启私有云的无限可能 引言 在数据存储与管理的不断演进中&#xff0c;群晖 DS 223 凭借其出色的性能和丰富的功能&#xff0c;成为众多用户搭建私有云的热门选择。而当它与 Docker 技术相遇&#xff0c;犹如为数据管理的舞台添上了绚丽多彩的灯…

Three.js 进阶(灯光阴影关系和设置、平行光、阴影相机)

本篇主要学习内容 : 灯光与阴影聚光灯点光源平行光阴影相机和阴影计算投射阴影接受阴影 点赞 关注 收藏 学会了 1.灯光与阴影 1、材质要满足能够对光有反应 2、设置渲染器开启阴影计算 renderer.shadowMap.enabledtrue 3、设置光照投射阴影 directionalLight.castShadow …

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Tomcat 的工作原理:从启动到请求处理的流程

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Tomcat…

计网面试准备

正确理解网络数据传输过程 同一路由器的不同接口属于不同局域网&#xff0c;广播只能在同一个局域网

【技术白皮书】内功心法 | 第二部分 | Telnet远程登录的工作原理

远程登录的工作原理 背景介绍远程登录远程登录的服务模式远程登录服务的实现基础远程登录服务的运行模式Telnet服务为什么不被操作系统管理 Telnet协议的原理网络虚终端&#xff08;NVT&#xff09;结束标示NVT的原理NVT屏蔽差异 背景介绍 绝大多数计算机都是运行多用户操作系…

游戏引擎学习第150天

回顾与当天计划 我们在这里完全不使用任何库&#xff0c;所以我们完全是引擎和库免疫的, 正如大家所知道的&#xff0c;我们正在编写自己的资源处理系统&#xff0c;准确来说&#xff0c;是一个资源加载系统。过去一周我们已经完成了很多工作&#xff0c;现在只剩下最后几步&a…

Flutter中stream学习

Flutter中stream学习 概述Stream的基础概念stream的常用方法Stream.fromFuture(Future<T> future)Stream.fromFutures(Iterable<Future<T>> futures)Stream.fromIterable(Iterable<T> elements)Stream.periodic(Duration period, [T computation(int c…

基于javaweb的SSM房屋租赁管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

物联网商业模式

物联网商业模式是一种战略规划&#xff0c;它融合了物联网技术来创造价值并获取收入。它与传统商业模式的不同之处在于&#xff0c;它利用互联设备来改善运营、提升客户体验以及优化服务项目。在当今由科技驱动的世界中&#xff0c;这种商业模式通过利用实时数据来提供创新服务…

从0开始的操作系统手搓教程45——实现exec

目录 建立抽象 实现加载 实现sys_execv &#xff01;&#xff01;&#xff01;提示&#xff1a;因为实现问题没有测试。所以更像是笔记&#xff01; exec 函数的作用是用新的可执行文件替换当前进程的程序体。具体来说&#xff0c;exec 会将当前正在运行的用户进程的进程体&…

【python爬虫】酷狗音乐爬取练习

注意&#xff1a;本次爬取的音乐仅有1分钟试听&#xff0c;仅作学习爬虫的原理&#xff0c;完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌&#xff0c;在请求里发现一段mp3文件&#xff0c;复制网址&#xff0c;确实是我们需要的url。 复制音频的…

Linux开发工具----vim

目录 Linux编辑器-vim使用 1. vim的基本概念 正常/普通/命令模式(Normal mode) 插入模式(Insert mode) 底行模式(last line mode) 2. vim的基本操作 3. vim正常模式命令集 4. vim底行模式命令集 5. vim操作总结 (本篇文章相当于vim常用命令字典) Linux编辑器-vim使用 我们先来看…