Qt c++開發中的delete QThread操作需注意

1、析構函數中,不能執行QEventLoop,會造成

  • 重入問題:事件循環可能觸發其他事件,導致已析構的對象被再次訪問
  • 信號槽連接:正在析構的對象可能還有未斷開的信號槽連接
  • 未定義行為:對象狀態不確定,可能導致崩潰

2、當被刪除的對象執行過moveToThread操作的時候,不能用delete,需要用deleteLater。但是被刪除對象的子對象在它的析構函數里可以用delete

3、只要是start過的線程,在析構函數里都需要執行下面的代碼,保證線程關閉,否則程序會崩潰報錯

    if (thread.isRunning())                                   {                                                         thread.quit();                                        if (!thread.wait(500))                                {                                                     thread.terminate();                               thread.wait();                                    LOG_ERROR("{}線程強制終止", thread.objectName()); }                                                     LOG_INFO("{}線程已停止", thread.objectName());        }

4、下面是我整理的幾個宏:

說明
DELETE_PTR_FUNC不跨線程的刪除調用的
DELETELATER_PTR_FUNC跨線程的刪除調用
STOP_OBJ_THREAD 停止線程使用
#include <QThread>#define DELETE_PTR_FUNC(obj_ptr) \if (obj_ptr)                 \{                            \obj_ptr->disconnect();   \delete obj_ptr;          \obj_ptr = nullptr;       \}#define DELETELATER_PTR_FUNC(obj_ptr) \if (obj_ptr)                      \{                                 \obj_ptr->disconnect();        \obj_ptr->deleteLater();       \obj_ptr = nullptr;            \}#define STOP_OBJ_THREAD(thread)                                                               \if (thread.isRunning())                                                                   \{                                                                                         \LOG_ERROR("{} thread stopping", thread.objectName());                                 \thread.quit();                                                                        \if (!thread.wait(200))                                                                \{                                                                                     \LOG_ERROR("{} thread did not quit gracefully, terminating", thread.objectName()); \thread.terminate();                                                               \thread.wait();                                                                    \}                                                                                     \LOG_INFO("{} thread stopped", thread.objectName());                                   \}#define STOP_PTR_THREAD(thread_ptr)                                                                \if (thread_ptr && thread_ptr->isRunning())                                                     \{                                                                                              \LOG_ERROR("{} thread stopping", thread_ptr->objectName());                                 \thread_ptr->quit();                                                                        \if (!thread_ptr->wait(200))                                                                \{                                                                                          \LOG_ERROR("{} thread did not quit gracefully, terminating", thread_ptr->objectName()); \thread_ptr->terminate();                                                               \thread_ptr->wait();                                                                    \}                                                                                          \LOG_INFO("{} thread stopped", thread_ptr->objectName());                                   \}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94349.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94349.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94349.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Seaborn數據可視化實戰:Seaborn圖表定制與數據可視化入門

高級圖表定制 學習目標 通過本課程你將掌握如何使用Seaborn庫進行高級圖表定制&#xff0c;包括圖表的標題、圖例、注釋的添加&#xff0c;以及圖表布局和大小的調整。這些技能將幫助你更有效地展示數據&#xff0c;使你的數據故事更加生動和有說服力。 相關知識點 Seaborn高級…

nano命令使用方法

nano 是 Ubuntu 等 Linux 系統中常用的輕量級文本編輯器&#xff0c;輕量易用&#xff0c;特別適合適合快速編輯配置文件、腳本等。以下是其核心使用方法&#xff1a;一、基本操作&#xff1a;打開 / 創建文件bash# 打開已存在文件&#xff08;若文件不存在則創建&#xff09; …

C#_gRPC

6.3 gRPC&#xff1a;高性能跨語言服務間通信 gRPC是一個高性能、開源、通用的RPC&#xff08;Remote Procedure Call&#xff09;框架&#xff0c;由Google開發并基于其多年的內部使用經驗&#xff08;Stubby&#xff09;。它現在是Cloud Native Computing Foundation&#xf…

Ubuntu 多版本 librealsense 與 realsense_ros 編譯并兼容 L515 等設備

這篇博客用來記錄如何在 Ubuntu 下編譯多個版本的 librealsense 并使用 L515 和 D435i 等設備。核心在于 L515 這款設備已經停止維護&#xff0c;直接安裝的方案不支持這個設備&#xff0c;只支持 D435i 等后期產品。如果想要同時使用新老的 realsense 產品&#xff0c;需要單獨…

Java 泛型 T、E、K、V、?、S、U、V

目錄 一、概述 二、為什么使用泛型 三、常見泛型類型參數的含義與用途 示例一&#xff1a;使用 T 定義泛型類 示例二&#xff1a;使用 E 表示集合元素 示例三&#xff1a;使用 K 和 V 表示鍵值對 示例四&#xff1a;使用 ? 通配符處理未知類型 四、通配符 ? 的擴展用…

1688拍立淘接口數據全面解析詳細說明(item_search_img)

一、接口概述 1688拍立淘接口是阿里巴巴1688平臺提供的基于圖像識別的商品搜索服務&#xff0c;允許開發者通過上傳商品圖片來搜索平臺上的同款或相似商品。該接口的主要功能是接收用戶上傳的圖片&#xff08;或圖片的相關信息&#xff09;&#xff0c;并通過1688平臺的圖像識…

【Docker項目實戰】使用Docker部署輕量級LetsMarkdown文本編輯器

【Docker項目實戰】使用Docker部署輕量級Markdown文本編輯器一、LetsMarkdown介紹1.1 LetsMarkdown簡介1.2 主要特點二、本次實踐介紹2.1 本地環境規劃2.2 本次實踐介紹三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3檢查docker compose 版本四、拉取容器鏡像五…

Node.js自研ORM框架深度解析與實踐

Node.js自研ORM框架深度解析與實踐 前言 在現代Web開發中&#xff0c;對象關系映射&#xff08;ORM&#xff09;框架扮演著至關重要的角色。它們為開發者提供了一層抽象&#xff0c;使得數據庫操作變得更加簡單和直觀。本文將深入解析一個基于Node.js和MySQL的自研ORM框架&…

匯總圖片拖進ps中 photoshop同時打開幾個文件夾

如果你有許多文件夾&#xff0c;你想選中一部分&#xff0c;然后把里面的圖片全部拖進photoshop當中&#xff0c;但是文件夾又不能直接拖進去&#xff0c;那么你可以嘗試使用一下這個工具&#xff0c;首先測試一下直接拖文件夾。選中你要處理的文件夾&#xff0c;直接拖進photo…

mysql 5.7 查詢運行時間較長的sql

開發過程遇到sql 執行時間長&#xff0c;又取消不了的情況 可使用 kill query ID 殺死進程獲取正在運行的sqlSELECT ID, -- 進程ID&#xff1a;MySQL服務器分配給每個連接的唯一標識符&#xff0c;用于區分不同的客戶端連接USER, …

MongoDB 從入門到實踐:全面掌握文檔型 NoSQL 數據庫核心操作

目錄 一、MongoDB 基礎準備 1. 官方資源獲取 2. 安裝步驟解析 二、MongoDB 核心指令詳解 1. 數據庫操作指令 2. 集合操作指令 3. 文檔操作指令 查詢文檔 插入文檔 修改文檔 刪除文檔 三、進階查詢技巧 1. 運算符的靈活運用 比較運算符 邏輯運算符 范圍與成員運算…

CVPR2025丨遙感領域,全模態與秒超高清遙感建模重大突破,性能提升創新點

關注gongzhonghao【CVPR頂會精選】剛入門遙感建模時&#xff0c;總好奇別人為什么總能提出新方法&#xff1f;慢慢摸索后才發現&#xff0c;創新點并不是硬憋出來的&#xff0c;而是要從數據特性、傳感器差異、地物細節以及環境變化中發現機會。不同波段、不同分辨率、不同時相…

HTML5詳篇

前端三劍客 前端三劍客是指HTML、CSS和JavaScript: HTML超文本標記語言(Hyper Text Markup Language):簡單理解描述網頁結構的;用于網頁內容的語言。它通過使用不同的HTML標簽來定義頁面中的各種元素,例如標題、段落、圖像、鏈接等【無羽毛的小鳥模型】 CSS層疊樣式表(…

【Transient-Free 3DGS】delayed densification + coarse to fine增加GS的魯棒性

25年最新連接去除場景瞬態對象工程與3DGS的pipeline&#xff0c;改進了spotlesssplats&#xff0c;已開源&#xff1a; [2506.02751] RobustSplat: Decoupling Densification and Dynamics for Transient-Free 3DGSAbstract page for arXiv paper 2506.02751: RobustSplat: De…

【MySQL】CRUD基礎詳解

CRUD基礎前言&#xff1a;數據庫的層級結構一、新增&#xff08;Create&#xff09;1. 單行數據 全列插入2. 單行數據的簡寫插入3. 指定列插入4. 多行數據插入二、查詢&#xff08;Retrieve&#xff09;1. 全列查詢2. 指定列查詢3. 查詢結果為表達式&#xff08;1&#xff09;…

互聯網大廠Java求職面試實錄:核心技術棧與業務場景解析

互聯網大廠Java求職面試實錄&#xff1a;核心技術棧與業務場景解析 面試場景設定 本文通過一個嚴肅的面試官和搞笑的水貨程序員大面條之間的對話&#xff0c;模擬互聯網大廠Java崗位的技術面試過程。面試涵蓋Java SE、Spring生態、數據庫、微服務、緩存、安全、消息隊列、AI等多…

response對象的elapsed屬性

在Python的requests庫中&#xff0c;當我們發送一個請求后&#xff0c;會得到一個Response對象&#xff0c;這個對象有一個elapsed屬性&#xff0c;它返回一個timedelta對象&#xff0c;表示從發送請求到收到響應所經過的時間。response.elapsed.total_seconds() 是 Python req…

【ansible】5.在受管主機部署文件和Jinja2模板

1.Ansible 中&#xff0c;如何用模塊創建一個文件并設置權限644并設置SELinux類型&#xff0c;如何從受管主機中刪除文件&#xff1f;使用ansible.builtin集合中的 file 模塊&#xff0c;添加state&#xff1a;touch 創建文件&#xff0c;mode&#xff1a;‘0644’ 設置權限&am…

雪花算法數據庫主鍵

雪花算法&#xff08;Snowflake&#xff09;作為一種分布式 ID 生成方案&#xff0c;在分布式系統中具有顯著優勢&#xff0c;能夠解決多個關鍵問題。以下是它的核心好處及主要應用場景&#xff1a;雪花算法的核心好處全局唯一性&#xff1a;通過時間戳、機器 ID、數據中心 ID …

C/C++ 頭文件命名約定

有的時候&#xff0c;在C的代碼中&#xff0c;可以看到有如下的頭文件引用的代碼: #include <iostream> #include <unistd.h> #include <csignal>其中有一些是引用了.h文件&#xff0c;另外一些是引用了模塊式的比如iostream和csignal&#xff0c;那么為什么…