Qt編程技巧總結篇(3)-信號-槽-多線程(二)

文章目錄

  • Qt編程技巧總結篇(3)-信號-槽-多線程(二)
    • 主進程與子線程
    • 線程同步
    • 實例與應用
  • 小結

Qt編程技巧總結篇(3)-信號-槽-多線程(二)

??多線程學習,使用QMutex,好了,開整~

主進程與子線程

主進程:經常處于空閑狀態,僅處理短小精悍、不怎么占用時間的“小”函數。
子線程:處理主要的計算啊!存儲啊!循環等復雜費時的任務。

線程同步

線程同步:子線程中運算量較大的函數在執行的過程中不希望被主線程調用,放置該函數的中斷, 因而這類函數需要被保護起來,令其在執行過程中不能被其他線程打斷,以保證計算機結果的完整性。
線程同步可以使用:QMutex,QMutexLocker,QReadWriteLock,QReadLocker, QWriteLocker,QWaitCondition,QSemaphore.
這里的例子主要是:QMutexQMutexLocker的應用。

實例與應用

下面的例子是《 QT5.9 c++ 開發指南》中的例子,代碼放這里,歡迎參考學習!

子線程.hqdicethread.h文件,

#ifndef QDICETHREAD_H
#define QDICETHREAD_H#include <QObject>
#include <QThread>
#include <QMutex>
#include <QMutexLocker>
#include <QTime>class QDiceThread : public QThread
{Q_OBJECT
public:QDiceThread();void diceBegin();                        // 投色子void diceEnd();                          // 讀色子void stopThread();                       // 停止線程bool readVal(int *seq,int *diceValue);   // 主線程讀色子private:QMutex mutex; //互斥量int m_seq = 0;int m_diceVal;bool m_pause = true;bool m_stop=false;protected:void run() Q_DECL_OVERRIDE;
};#endif // QDICETHREAD_H

子線程.hqdicethread.cpp 文件,

#include "qdicethread.h"QDiceThread::QDiceThread()
{}void QDiceThread::diceBegin()
{m_pause = false;
}void QDiceThread::diceEnd()
{m_pause = true;
}void QDiceThread::stopThread()
{m_stop = true;
}bool QDiceThread::readVal(int *seq, int *diceValue)
{if(mutex.tryLock())     //試圖鎖定一個互斥量,成功返回true。{*seq = m_seq;*diceValue = m_diceVal;mutex.unlock();return true;}else{return false;}
}void QDiceThread::run()
{m_stop = false;m_seq = 0;qsrand(QTime::currentTime().msec()); // 隨機數初始化,qsrand是線程安全的while(!m_stop){/* mutex.lock() 與 mutex.unlock() 配對使用 */
//        if(!m_pause)
//        {
//            mutex.lock();           //鎖定互斥量,他將阻塞執行直到其他線程解鎖這個互斥量
//            m_diceVal = qrand();
//            m_diceVal = (m_diceVal%6)+1;
//            m_seq++;
//            mutex.unlock();         // 解鎖互斥量
//        }/* 在一些邏輯復雜的代碼中,上述方法配對容易出錯,可采用QMutexLocker的方法進行簡化 */if(!m_pause){QMutexLocker Locker(&mutex);m_diceVal = qrand();m_diceVal = (m_diceVal%6)+1;m_seq++;}msleep(100); // 休眠100ms}
}

主線程.h :dialog.h文件,

#ifndef DIALOG_H
#define DIALOG_H#include <QDebug>
#include <QDialog>
#include <QTimer>
#include "qdicethread.h"QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }class Dialog : public QDialog
{Q_OBJECT// 需要寫在前面
private:int mSeq,mDiceValue;QDiceThread   threadA;QTimer  mTimer;//定時器public:Dialog(QWidget *parent = nullptr);~Dialog();private slots:void onthreadA_started();void onthreadA_finished();void onTimeOut(); //定時器處理槽函數????void on_btnStartThread_clicked();void on_btnDiceBegin_clicked();void on_btnDiceEnd_clicked();void on_btnStopThread_clicked();void on_btnClear_clicked();private:Ui::Dialog *ui;protected:void closeEvent(QCloseEvent *evet);};
#endif // DIALOG_H

主線程.cpp :dialog.cpp文件,

  • 連接槽函數與信號函數
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);connect(&threadA,SIGNAL(started()),this,SLOT(onthreadA_started()));connect(&threadA,SIGNAL(finished()),this,SLOT(onthreadA_finished()));connect(&mTimer,SIGNAL(timeout()),this,SLOT(onTimeOut()));}Dialog::~Dialog()
{delete ui;
}void Dialog::onthreadA_started()
{ui->LabA->setText("Thread 狀態:thread started.");
}void Dialog::onthreadA_finished()
{ui->LabA->setText("Thread 狀態:thread finished.");
}void Dialog::onTimeOut()
{int tmpSeq=0,tmpValue=0;bool valid = threadA.readVal(&tmpSeq, &tmpValue);if(valid && (tmpSeq != mSeq)) // 獲取的是有效且新的數據{qDebug()<<tmpSeq;mSeq = tmpSeq;mDiceValue = tmpValue;QString str=QString::asprintf("第 %d 次投擲點數為:%d",mSeq,mDiceValue);ui->plainTextEdit->appendPlainText(str);QPixmap pic;QString fileName = QString::asprintf(":/dice/images/d%d.jpg",mDiceValue);pic.load(fileName);ui->LabPic->setPixmap(pic);}
}void Dialog::on_btnStartThread_clicked()
{mSeq = 0;threadA.start();ui->btnStartThread->setEnabled(false);ui->btnStopThread->setEnabled(true);ui->btnDiceBegin->setEnabled(true);ui->btnDiceEnd->setEnabled(false);
}void Dialog::on_btnDiceBegin_clicked()
{threadA.diceBegin();mTimer.start(100); //定時器100ms讀一次數據ui->btnDiceBegin->setEnabled(false);ui->btnDiceEnd->setEnabled(true);
}void Dialog::on_btnDiceEnd_clicked()
{threadA.diceEnd();mTimer.stop(); // 暫停定時器ui->btnDiceBegin->setEnabled(true);ui->btnDiceEnd->setEnabled(false);
}void Dialog::on_btnStopThread_clicked()
{threadA.stopThread();threadA.wait();ui->btnStartThread->setEnabled(true);ui->btnStopThread->setEnabled(false);ui->btnDiceBegin->setEnabled(false);ui->btnDiceEnd->setEnabled(false);
}void Dialog::on_btnClear_clicked()
{ui->plainTextEdit->clear();
}void Dialog::closeEvent(QCloseEvent *evet)
{if(threadA.isRunning()){threadA.stopThread();threadA.wait();}evet->accept();
}

主函數main.cpp文件,

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog w;w.show();return a.exec();
}

小結

??學習,加油,共勉。

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

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

相關文章

RTK_ROS_導航(3):點云的壓縮,PointCloud轉scan

目錄 1. 源碼的安裝2. 修改訂閱的話題3. 可視化1. 源碼的安裝 安裝過程如下 mkdir -p point_to_scan_ws/src cd point_to_scan_ws/src git clone https://github.com/BluewhaleRobot/pointcloud_to_laserscan.git cd .. catkin_make source devel/setup.bash2. 修改訂閱的話題 …

2024.07.01校招 實習 內推 面經

綠*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;內推/實習/校招匯總表格 1、校招 | 元戎啟行2025校園招聘正式批正式啟動&#xff08;內推&#xff09; 校招 | 元戎啟行2025校園招聘正式批正式啟動&#xff08;內推&#xff09; 2、提前批 | 多益網絡2025屆校園…

基于抽象 HandlerInterceptor 快速實現接口鑒權

歡迎關注公眾號&#xff1a;冬瓜白 相關文章&#xff1a; 每天學習一點點之 Spring Web MVC 之抽象 HandlerInterceptor 快速實現常用功能&#xff08;限流、權限等&#xff09; 在[每天學習一點點之 Spring Web MVC 之抽象 HandlerInterceptor 快速實現常用功能&#xff08…

Numpy的廣播機制(用于自動處理不同形狀的數組)

NumPy 廣播是一種強大的機制&#xff0c;允許 NumPy 在執行元素級運算時自動處理不同形狀的數組。廣播的規則使得無需顯式地創建匹配形狀的數組&#xff0c;直接進行運算&#xff0c;大大簡化了代碼并提高了效率。 基本概念 廣播的基本思想是讓較小的數組在需要的維度上進行擴…

【MySQL數據庫之概念性問題】

1、關系型數據庫和非關系型數據庫 關系型數據庫&#xff08;Relational Database&#xff0c;簡稱RDBMS&#xff09;和非關系型數據庫&#xff08;NoSQL Database&#xff09;是兩種不同的數據庫類型。SQL本身叫做結構化查詢語言1、關系型數據庫&#xff1a;&#xff08;MySQL…

Django 更新數據 save()方法

1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharFie…

Spring Boot集成grpc快速入門demo

1.什么是GRPC&#xff1f; gRPC 是一個高性能、開源、通用的RPC框架&#xff0c;由Google推出&#xff0c;基于HTTP2協議標準設計開發&#xff0c;默認采用Protocol Buffers數據序列化協議&#xff0c;支持多種開發語言。gRPC提供了一種簡單的方法來精確的定義服務&#xff0c…

UE5.3-基礎藍圖類整理一

常用藍圖類整理&#xff1a; 1、獲取當前關卡名&#xff1a;Get Current LevelName 2、通過關卡名打開關卡&#xff1a;Open Level(by name) 3、碰撞檢測事件&#xff1a;Event ActorBeginOverlap 4、獲取當前player&#xff1a;Get Player Pawn 5、判斷是否相等&#xff1…

深入解析CSS中的!important規則:優先級與最佳實踐

先上實踐&#xff0c;再討論設計 在實際工程中&#xff0c;!important 的使用場景通常出現在需要確保某個樣式規則具有最高優先級&#xff0c;以覆蓋其他可能沖突的樣式規則時。以下是一個具體的例子&#xff1a; 場景描述 假設你正在開發一個網站&#xff0c;該網站使用了多…

JavaScript的數組與函數

數組 <script type"text/javascript">/** 知識點&#xff1a;數組* 理解&#xff1a;一維數組的容器* 概念&#xff1a;* 1.數組中的數據叫做元素* 2.元素都有編號叫做下標/索引* 3.下標從0開始* 注意&#xff1a;* 1.數組作為數據的容器…

【JavaScript腳本宇宙】狀態管理利器:JavaScript 庫全面解析

提升項目效率與可維護性&#xff1a;JavaScript 狀態管理庫大揭秘 前言 在現代前端開發中&#xff0c;狀態管理是一個至關重要的話題。隨著復雜性的增加&#xff0c;有效地管理應用程序的狀態變得越來越具有挑戰性。本文將介紹一些流行的 JavaScript 庫&#xff0c;這些庫提供…

WEB安全基礎:網絡安全常用術語

一、攻擊類別 漏洞&#xff1a;硬件、軟件、協議&#xff0c;代碼層次的缺陷。 后?&#xff1a;方便后續進行系統留下的隱蔽后?程序。 病毒&#xff1a;一種可以自我復制并傳播&#xff0c;感染計算機和網絡系統的惡意軟件(Malware)&#xff0c;它能損害數據、系統功能或攔…

C++語言學習精簡筆記(包含C++20特性)

目錄 1 C新語法C與CC編譯運行String編程范式C基礎類型**自動類型推導**統一對象初始化&#xff1a;Uniform Initialization 控制結構if語句for語句switch語句namespace 2 函數函數聲明形式參數函數參數傳遞的選擇函數返回值的選擇 函數重載 Lambda表達式函數的定義和申明生存期…

磁力貓磁力搜索大全教程,如何使用磁力鏈接

磁力鏈接是一種特殊的下載鏈接&#xff0c;磁力鏈接可以理解為一個文件識別碼&#xff0c;而并非具體的資源地址&#xff0c;下載軟件需要拿著這個識別碼去整個互聯網(DHT網絡)去尋找持有該資源的用戶(節點)&#xff0c;如果找到則可以進行傳輸下載。一般年代越久遠的磁力鏈接下…

【一】m2芯片的mac中安裝ubuntu24虛擬機集群

文章目錄 1. 虛擬機配置2. 復制虛擬機2.1 修改主機名2.2 修改網絡 1. 虛擬機配置 在官方網站下載好ubuntu24-arm版鏡像開始安裝&#xff0c;安裝使用VMWare Fusion的社區免費授權版,使用一臺m2芯片的mac電腦作為物理機平臺。 為什么選擇ubuntu24&#xff1f;因為centOS7目前已…

Proteus + Keil單片機仿真教程(五)多位LED數碼管的靜態顯示

Proteus + Keil單片機仿真教程(五)多位LED數碼管 上一章節講解了單個數碼管的靜態和動態顯示,這一章節將對多個數碼管的靜態顯示進行學習,本章節主要難點: 1.鎖存器的理解和使用; 2.多個數碼管的接線封裝方式; 3.Proteus 快速接頭的使用。 第一個多位數碼管示例 元件…

『C + ⒈』‘\‘

&#x1f942;在反斜杠(\)有⒉種最常用的功能如下所示&#x1f44b; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(void) {int a 10;int b 20;int c 30;if (a 10 &&\b 20 &&\c 30){printf("Your print\n");}else{prin…

二分查找3

1. 有序數組中的單一元素&#xff08;540&#xff09; 題目描述&#xff1a; 算法原理&#xff1a; 二分查找解題關鍵就在于去找到數組的二段性&#xff0c;這里數組的二段性是從單個數字a開始出現然后分隔出來的&#xff0c;如果mid落入左半部分那么當mid為偶數時nums[mid1]…

ByteMD富文本編輯器的vue3配置

Git地址&#xff1a;GitHub - bytedance/bytemd: ByteMD v1 repository 控制面板輸入 npm install bytemd/vue-next 下載成功后在src/main.ts中引用 import "bytemd/dist/index.css";引入后保存&#xff0c;下面是一些插件&#xff0c;比如說我用到gmf和hightLight&…

java后端向jsp傳日期,jsp調用數據錯誤問題

問題 今天遇到個bug&#xff0c;后端使用request.setAttribute("key", value);將startDate、endDate兩個日期字符串傳遞到jsp中&#xff0c;使jsp可以獲取到日期進行查詢操作。但接口拼接的參數startDate為2017&#xff0c;endDate為1986&#xff0c;讓人百思不得其…