Qt—(Qt線程,Qt進程,,QT與sqlite數據庫)

一 Qt線程與進程概述

線程與進程對比

特性線程 (QThread)進程 (QProcess)
內存空間共享父進程內存獨立內存空間
創建開銷小 (幾MB)大 (幾十MB)
通信方式共享內存/信號槽管道/套接字/文件
崩潰影響導致整個進程終止僅自身終止
適用場景高并發任務、計算密集型隔離第三方應用、安全需求

二 Qt線程

1. 基本概念

  • 線程:程序執行的最小單元,共享相同內存空間

  • QThread:Qt中線程管理的核心類

  • 線程安全:多線程訪問共享資源時需同步

?2. 創建方式(四種)

  • 繼承QThread類,重寫run()方法

  • 使用moveToThread將一個繼承QObject的子類對象移至線程,內部槽函數均在子線程中執行

  • 使用QThreadPool,搭配QRunnable (線程池)

  • 使用QtConcurrent(線程池)

n. 線程創建

1. QThread,重寫run()

#include <QThread>
#include <QDebug>class WorkerThread : public QThread {Q_OBJECT
protected:void run() override {for (int i = 0; i < 5; ++i) {qDebug() << "Thread working:" << i;sleep(1);  // 模擬耗時操作}}
};// 使用
int main() {WorkerThread thread;thread.start();  // 啟動線程thread.wait();   // 等待線程結束return 0;
}

2.?moveToThread

#include <QObject>
#include <QThread>
#include <QDebug>class Worker : public QObject {Q_OBJECT
public slots:void doWork() {for (int i = 0; i < 5; ++i) {qDebug() << "Worker in thread:" << QThread::currentThreadId();QThread::sleep(1);}emit workDone();}
signals:void workDone();
};// 使用
int main() {QThread thread;Worker worker;worker.moveToThread(&thread);  // 關鍵步驟QObject::connect(&thread, &QThread::started, &worker, &Worker::doWork);QObject::connect(&worker, &Worker::workDone, &thread, &QThread::quit);thread.start();thread.wait();return 0;
}

3.?QThreadPool(線程池)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QThreadPool"
#include "MyTask.cpp"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mytask.cpp"
#include "QThreadPool"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//新建10個任務,提交給線程池//方式1: 全局線程池:一個項目中只有一個線程池,有時候整個項目有有可能有多個//QThreadPool *pool =    QThreadPool::globalInstance();//方式2:新建線程池QThreadPool *pool = new QThreadPool;for(int i=0;i<10;i++){pool->start( new MyTask());}}MainWindow::~MainWindow()
{delete ui;
}}MainWindow::~MainWindow()
{delete ui;
}#include <QRunnable>
#include <QDebug>
#include <QThread>
class MyTask : public QRunnable
{//重寫run方法void run() override{qDebug()<< QThread::currentThread() << "running .....";}};

4.?QtConcurrent(線程池)

三 Qt進程

1. 基本概念

  • 進程:獨立內存空間的程序實例

  • QProcess:用于啟動和控制外部程序

進程是一個應用程序被操作系統拉起來加載到內存之后從開始執行到執行結束的這樣一個過程。簡單來說,進程是程序(應用程序,可執行文件)的一次執行。進程通常由程序、數據和進程控制塊(PCB)組成。比如雙擊打開一個桌面應用軟件就是開啟了一個進程。

傳統的進程有兩個基本屬性:可擁有資源的獨立單位;可獨立調度和分配的基本單位。對于這句話我的理解是:進程可以獲取操作系統分配的資源,如內存等;進程可以參與操作系統的調度,參與CPU的競爭,得到分配的時間片,獲得處理機(CPU)運行。

進程在創建、撤銷和切換中,系統必須為之付出較大的時空開銷,因此在系統中開啟的進程數不宜過多。比如你同時打開十幾個應用軟件試試,電腦肯定會卡死的。于是緊接著就引入了線程的概念

四 sqlite數據庫

? sqlite十個輕量級的數據庫,如果要進行嵌入式的開發,像mysql,與Oracle像這樣的中大型關系庫是不太現實的,因為嵌入式大部分的工作,還是以輕量級的項目為主,盡可能的節約空間,完成項目,sqlite可以不用他的專屬服務器就可以使用,它可以以一個文件為庫,可以還可以用sql的語句,兼顧效率的同時,也極致的輕量化。

? 在此我認為只需要寫兩個項目即可,一是如何鏈接數據庫,二是如何進行增刪改查。

1. 連接數據庫

其實我建議將連接數據庫的語句單獨寫個類出來,這樣簡化操作,上上選。

1. 在我的project.pro的上方添加?

QT ? ? ? += core gui sql?

2. 引入頭

#include <QSqlDatabase>
#include <QSqlError> //sql錯誤信息頭文件
#include <QSqlQuery> //sql查詢頭文件
  QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 鏈接數據庫db.setDatabaseName("D:/360MoveData/Users/HP/Desktop/sqlite_db/test.db");if (db.open() == false){qDebug() << "數據庫打開失敗";return;}else{qDebug() << "數據庫打開成功";// 新建tableQSqlQuery query;QString sql = "create table if not exists user(id int primary key, name varchar(20))";if (query.exec(sql)){qDebug() << "表格創建成功";// 向user插入數據sql = "insert into user(id, name) values(1, '張三')";if (query.exec(sql)){qDebug() << "數據插入成功";// 查詢數據sql = "select * from user";if (query.exec(sql)){qDebug() << "數據查詢成功";// 輸出到qDebugwhile (query.next()){qDebug() << query.value(0).toInt() << query.value(1).toString();}}else{qDebug() << "數據查詢失敗";}}else{qDebug() << "數據插入失敗";}}else{qDebug() << "表格創建失敗";qDebug() << query.lastError().text();}}
}

2. 增刪改查示例

這個寫了個dao來進行數據庫的處理,相信大家可以看的懂,其實不難。仔細看一看。

#include "studentdao.h"/*** @brief 構造函數* 獲取數據庫連接*/
StudentDAO::StudentDAO(): m_db(DatabaseManager::getInstance()->getDatabase())
{
}/*** @brief 添加學生* @param student 學生對象* @return 添加成功返回true,否則返回false*/
bool StudentDAO::addStudent(const Student &student)
{if (!m_db.isOpen()){qDebug() << "添加學生失敗:數據庫未連接";return false;}QSqlQuery query(m_db);// 使用參數化查詢,防止SQL注入query.prepare("INSERT INTO student (id, name) VALUES (:id, :name)");query.bindValue(":id", student.id());query.bindValue(":name", student.name());if (query.exec()){qDebug() << "添加學生成功:ID=" << student.id() << ", 姓名=" << student.name();return true;}else{qDebug() << "添加學生失敗:" << query.lastError().text();return false;}
}/*** @brief 刪除學生* @param id 學生ID* @return 刪除成功返回true,否則返回false*/
bool StudentDAO::deleteStudent(int id)
{if (!m_db.isOpen()){qDebug() << "刪除學生失敗:數據庫未連接";return false;}QSqlQuery query(m_db);query.prepare("DELETE FROM student WHERE id = :id");query.bindValue(":id", id);if (query.exec()){if (query.numRowsAffected() > 0){qDebug() << "刪除學生成功:ID=" << id;return true;}else{qDebug() << "刪除學生失敗:未找到ID為" << id << "的學生";return false;}}else{qDebug() << "刪除學生失敗:" << query.lastError().text();return false;}
}/*** @brief 更新學生信息* @param student 學生對象* @return 更新成功返回true,否則返回false*/
bool StudentDAO::updateStudent(const Student &student)
{if (!m_db.isOpen()){qDebug() << "更新學生失敗:數據庫未連接";return false;}QSqlQuery query(m_db);query.prepare("UPDATE student SET name = :name WHERE id = :id");query.bindValue(":name", student.name());query.bindValue(":id", student.id());if (query.exec()){if (query.numRowsAffected() > 0){qDebug() << "更新學生成功:ID=" << student.id() << ", 新姓名=" << student.name();return true;}else{qDebug() << "更新學生失敗:未找到ID為" << student.id() << "的學生";return false;}}else{qDebug() << "更新學生失敗:" << query.lastError().text();return false;}
}/*** @brief 根據ID查詢學生* @param id 學生ID* @return 學生對象,如果不存在返回空對象*/
Student StudentDAO::getStudentById(int id)
{Student student;if (!m_db.isOpen()){qDebug() << "查詢學生失敗:數據庫未連接";return student;}QSqlQuery query(m_db);query.prepare("SELECT id, name FROM student WHERE id = :id");query.bindValue(":id", id);if (query.exec() && query.next()){student.setId(query.value(0).toInt());student.setName(query.value(1).toString());qDebug() << "查詢學生成功:ID=" << student.id() << ", 姓名=" << student.name();}else{qDebug() << "查詢學生失敗:未找到ID為" << id << "的學生";}return student;
}/*** @brief 查詢所有學生* @return 學生對象列表*/
QList<Student> StudentDAO::getAllStudents()
{QList<Student> students;if (!m_db.isOpen()){qDebug() << "查詢所有學生失敗:數據庫未連接";return students;}QSqlQuery query("SELECT id, name FROM student", m_db);while (query.next()){Student student;student.setId(query.value(0).toInt());student.setName(query.value(1).toString());students.append(student);}qDebug() << "查詢所有學生成功,共" << students.size() << "條記錄";return students;
}

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

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

相關文章

計算機視覺階段一:CV入門基礎

目錄 學習目標&#xff1a; 一、核心知識點 二、實用工具推薦 三、學習內容與步驟 1.環境搭建 2.圖像獲取與顯示 3 圖像基礎處理 4 圖像幾何變換 5 圖像像素操作 四、實戰任務建議 實戰 1&#xff1a;圖像加載 顯示 保存 實戰 2&#xff1a;灰度圖 邊緣檢測 圖…

新增MCP接入和AutoAgent,漢得靈猿AI中臺1.6版正式發布!

漢得靈猿&#xff08;大圣&#xff09;AI中臺1.6版本&#xff0c;經過數月迭代&#xff0c;現已正式發布&#xff01; 新版本最被期待的新功能&#xff0c;無疑是4月份預告的MCP接入&#xff0c;而令人同樣激動的另一項新功能&#xff0c;則是AutoAgent動態規劃智能體。除了兩…

總結匯報思路

一、明確匯報目標 受眾需求&#xff1a;領導/客戶/團隊最關心什么&#xff1f;&#xff08;結果&#xff1f;問題&#xff1f;下一步計劃&#xff1f;&#xff09; 核心目的&#xff1a;展示成果&#xff1f;爭取資源&#xff1f;總結經驗&#xff1f;解決問題&#xff1f; 時…

文件鎖的藝術:深入解析 `fcntl(F_SETLK/F_GETLK)`

引言&#xff1a;在共享資源時代守護數據一致性 在多進程/多線程的應用場景中&#xff0c;文件作為一種共享資源常常面臨被并發訪問的挑戰。想象一個數據庫系統&#xff0c;多個客戶端可能同時嘗試修改同一數據文件&#xff1b;或者一個配置文件&#xff0c;需要確保在更新時不…

一個免費的視頻、音頻、文本、圖片多媒體處理工具

大家好&#xff0c;我是小悟。 給大家推薦一款可以免費使用的視頻、音頻、文本、圖片處理工具&#xff0c;名字叫百創工坊&#xff0c;不用下載&#xff0c;不用注冊&#xff0c;有免費的用就趕緊薅吧。 視頻工具 提取音頻&#xff1a;從視頻中提取音頻文件&#xff0c;支持多…

在 ef core 中操作復雜類型的序列化和反序列化時,如何全局設置 utf-8 編碼避免中文字符被轉義?

我們在使用 Entity Framework Core&#xff08;EF Core&#xff09; 時&#xff0c;如果希望 全局設置 JSON 序列化和反序列化使用 UTF-8 編碼&#xff0c;通常需要配置 System.Text.Json 的默認行為&#xff0c;因為 EF Core 6.0 及以上版本默認使用 System.Text.Json 進行 JS…

WPF CommunityToolkit.Mvvm 信使 (ObservableRecipient)

WPF CommunityToolkit.Mvvm 中的 ObservableRecipient 是什么&#xff1f; ObservableRecipient 是 .NET Community Toolkit MVVM 庫中的一個核心類&#xff0c;繼承自 ObservableObject。它專為 WPF 應用設計&#xff0c;提供以下核心功能&#xff1a; 基礎數據綁定支持&am…

《C++》命名空間簡述

文章目錄 一、命名空間定義二、訪問命名空間內的成員三、標準命名空間:std四、嵌套命名空間 一、命名空間定義 在C中&#xff0c;命名空間&#xff08;namespace)是一種將標識符分組的機制&#xff0c;用于避免重命名。例如&#xff1a; int a 3;int main() {int a 0;print…

【路徑規劃】基于Matlab的改進RRT算法二維/三維路徑規劃

基于Matlab的改進RRT算法二維/三維路徑規劃 一、引言 在機器人學、自動駕駛等領域&#xff0c;路徑規劃是一個關鍵問題&#xff0c;它旨在為機器人或車輛找到一條從起始點到目標點的安全、高效的路徑。RRT&#xff08;Rapidly-exploring Random Trees&#xff09;算法作為一種…

PHP的命名空間與自動加載機制

在PHP 5.3版本之后&#xff0c;引入了命名空間的概念&#xff0c;這為解決全局命名沖突和促進代碼的模塊化提供了強有力的工具。命名空間允許開發者將類、函數和常量封裝在不同的命名空間中&#xff0c;從而避免了全局范圍內的名稱沖突問題。 命名空間基礎 命名空間在PHP中是…

OpenSIPS 邂逅 Kafka:構建高效 VoIP 消息處理架構

使用場景使用步驟 引入模塊組裝&發送數據消費數據故障轉移 使用場景 異步日志處理&#xff1a;將 OpenSIPS 中的 SIP 信令日志、通話記錄&#xff08;CDR&#xff09;等數據發送到 Kafka 隊列中。 事件通知與監控&#xff1a;利用 OpenSIPS 的 event_interface 模塊將 S…

《AI大模型應用技術開發工程師》學習總結

以下是對你提供的《AI大模型應用技術開發工程師》課程內容的系統梳理&#xff0c;已去除所有廣告、價格、報名、個人信息等內容&#xff0c;并補全了技術要點&#xff0c;最后給出客觀的學習建議和個人感想&#xff0c;適合公開分享或自我學習參考。 AI大模型應用技術開發工程師…

Python爬蟲實戰:研究LOSO相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網數據的爆炸式增長,個性化推薦系統成為提升用戶體驗的關鍵技術。準確捕捉用戶興趣需要大量多維度數據,但獲取高質量標注數據面臨隱私保護、數據分散等挑戰。網絡爬蟲技術為自動采集用戶行為數據提供了解決方案,而如何有效評估模型在個…

stm32萬年歷仿真+keil5程序

stm32萬年歷 本設計是利用單片機實現一個簡易萬年歷系統&#xff0c;能夠準確顯示時、分、秒信息。用戶可通過特定按鍵對時間進行設置調整&#xff0c;具備基本的時間校準功能&#xff0c;可滿足日常簡易計時需求。運用了stm32單片機模塊內部定時器 / 計數器功能來實現精確計時…

操作系統--名稱解釋

第一章: 操作系統:位于硬件層之上,所有軟件層之下的一個系統軟件,是管理系統中各種軟硬件資源,方便用戶使用計算機系統的程序集合 并發:宏觀上是同時發生,但是再微觀是交替發生的(若干事件在同一時間間隔內發生,單CPU) 并行:微觀上同時發生(要求多個CPU) 共享:系統的資源可以…

2025.6.16-實習

2025.6.18--2025.6.23 1.使用Cocos&#xff0c;從0開發老虎棒子雞2D游戲。實現&#xff1a;AI自動選擇&#xff0c;倒計時&#xff0c;對戰邏輯&#xff0c;播放動畫&#xff0c;設置背景音樂等功能。 2.使用Cocos&#xff0c;開發2D手術游戲。實現&#xff1a;視頻、音頻控制播…

構建你的 AI 模塊宇宙:Spring AI MCP Server 深度定制指南

引言&#xff1a;當模塊化遇見 AI 在微服務架構的海洋中&#xff0c;MCP&#xff08;Module Communication Protocol&#xff09;就像一艘智能帆船&#xff0c;它讓不同 AI 模塊的通信變得優雅而高效。本文將帶你構建一艘屬于自己的 AI 智能帆船——自定義 Spring AI MCP Serv…

從數據到洞察:UI前端如何利用大數據優化用戶體驗

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在當今數字化時代&#xff0c;數據如同蘊藏著無限價值的寶藏&#xff0c;源源不斷地產生并積累…

SQLite3 在嵌入式C環境中存儲音頻/視頻文件的專業方案

SQLite3 在嵌入式C環境中存儲音頻/視頻文件的專業方案 在嵌入式系統中存儲大型媒體文件需要平衡存儲效率、訪問速度和資源限制。以下是針對嵌入式C環境的優化方案&#xff1a; 一、存儲策略選擇 1. 直接存儲 vs 文件路徑存儲 方法優點缺點適用場景BLOB直接存儲數據一致性高…

區塊鏈技術概述:從比特幣到Web3.0

目錄 區塊鏈技術概述&#xff1a;從比特幣到Web3.0引言&#xff1a;數字革命的下一篇章1. 區塊鏈技術基礎1.1 區塊鏈定義與核心特征1.2 區塊鏈數據結構可視化 2. 比特幣&#xff1a;區塊鏈的開端2.1 比特幣的核心創新2.2 比特幣交易生命周期 3. 以太坊與智能合約革命3.1 以太坊…