qt c++ 進程和線程

在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.pswp.cn/web/71973.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71973.shtml
英文地址,請注明出處:http://en.pswp.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;定義被控對象的數學模型 假設被控對象是…

Conda常用命令匯總

Conda 是一個流行的包管理器和環境管理工具&#xff0c;廣泛應用于數據科學、機器學習等領域。它可以幫助我們管理 Python 包以及不同版本的環境&#xff0c;避免包沖突&#xff0c;提升項目的可復現性。以下是一些常用的 Conda 命令&#xff0c;涵蓋環境創建、管理、包安裝等常…

大數據實時分析:ClickHouse、Doris、TiDB 對比分析

1. 引言 在大數據分析領域,實時分析需求越來越重要。ClickHouse、Doris 和 TiDB 作為當前流行的實時分析數據庫,各自針對不同的應用場景和數據特性進行了優化。本文將對比它們的核心架構、適用場景以及查詢優化方法,幫助數據開發人員選擇合適的工具。 2. 核心架構對比 2.…

藍橋杯歷年真題題解

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版本…

嵌入式硬件篇---手柄控制控制麥克納姆輪子

文章目錄 前言1. 變量定義2. 搖桿死區設置3. 模式檢查4. 搖桿數據處理4.1 右搖桿垂直值&#xff08;psx_buf[7]&#xff09;4.2 右搖桿水平值&#xff08;psx_buf[8]&#xff09;4.3 左搖桿水平值&#xff08;psx_buf[5]&#xff09;4.4 左搖桿垂直值&#xff08;psx_buf[6]&am…

阿里千問大模型(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;猶如為數據管理的舞臺添上了絢麗多彩的燈…

git切換版本

git brach 查看本地 剛從git上下載下來 的話 可以通過 git checkout xxxx進行切換 可能一段時間沒有用 而服務器上新建了某些版本 那么需要用 git fetch origin 同步本地與git服務器的分支 然后 創建本地分支xxx 并從服務器拉取xxx git checkout -b xxx origin/xxx…

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…

【GPT入門】第11課 FunctionCall調用本地代碼入門

【GPT入門】第11課 FunctionCall調用代碼入門 1. 手撕FunctionCall2.代碼3.functionCall的結果 1. 手撕FunctionCall 為了了解&#xff0c;funcationCall底層&#xff0c;手寫一個functionCall多方法&#xff0c;并調用&#xff0c;體驗 思路&#xff1a; 任務&#xff1a;讓…

MySQL主從架構配合ShardingJdbc實現讀寫分離

文章目錄 目錄架構搭建讀寫分離pom.xmlfdy-live-user-provider 模塊application.ymlfdy-db-sharding.yamlShardingJdbcDatasourceAutoInitConnectionConfig.java 目錄 架構搭建 基于Docker去創建MySQL的主從架構 讀寫分離 pom.xml <dependency><groupId>mysql…

計網面試準備

正確理解網絡數據傳輸過程 同一路由器的不同接口屬于不同局域網&#xff0c;廣播只能在同一個局域網

NLP常見任務專題介紹(1)-關系抽取(Relation Extraction, RE)任務訓練模板

?? 關系抽取(Relation Extraction, RE)任務訓練示例 本示例展示如何訓練一個關系抽取模型,以識別兩個實體之間的關系。 1?? 任務描述 目標:從文本中提取兩個實體之間的語義關系,例如 “人物 - 組織”、“藥物 - 疾病”、“公司 - 創始人” 等。輸入:句子 + 標注的實…

【技術白皮書】內功心法 | 第二部分 | Telnet遠程登錄的工作原理

遠程登錄的工作原理 背景介紹遠程登錄遠程登錄的服務模式遠程登錄服務的實現基礎遠程登錄服務的運行模式Telnet服務為什么不被操作系統管理 Telnet協議的原理網絡虛終端&#xff08;NVT&#xff09;結束標示NVT的原理NVT屏蔽差異 背景介紹 絕大多數計算機都是運行多用戶操作系…