国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【QT多線程一】繼承QThread,重寫run函數(shù)

這篇具有很好參考價(jià)值的文章主要介紹了【QT多線程一】繼承QThread,重寫run函數(shù)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Qt有兩種多線程的方法,其中一種是繼承QThread的run函數(shù),另外一種是把一個(gè)繼承于QObject的類轉(zhuǎn)移到一個(gè)Thread里。
在這里先介紹一下qt多線程的第一種實(shí)現(xiàn)方法,繼承qthread并重寫run函數(shù)。
注意:QThread只有run函數(shù)是在新線程里的,其他所有函數(shù)都在QThread生成的線程里。如果QThread是在ui所在的線程里生成,那么QThread的其他非run函數(shù)都是和ui線程一樣的,所以,QThread的繼承類的其他函數(shù)盡量別要有太耗時(shí)的操作,要確保所有耗時(shí)的操作都在run函數(shù)里。
下面給出通過重寫run函數(shù)實(shí)現(xiàn)多線程的小例子。

  1. 首先使用qt新建一個(gè)widget項(xiàng)目,然后在項(xiàng)目里添加MyThread類。
  2. MyThread類繼承QThread類,并在cpp文件里重寫run函數(shù)。
  3. 在widget中使用start函數(shù)開啟線程,啟動(dòng)run函數(shù)。
  4. run函數(shù)結(jié)束之前會(huì)發(fā)送finished信號(hào),可自定義槽函數(shù)。

mythread.h文件

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

class MyThread : public QThread
{
public:
    MyThread();
    void closeThread();

protected:
    virtual void run();

private:
    volatile bool isStop;       //isStop是易失性變量,需要用volatile進(jìn)行申明
};

#endif // MYTHREAD_H

mythread.cpp文件

#include "mythread.h"
#include <QDebug>
#include <QMutex>

MyThread::MyThread()
{
    isStop = false;
}

void MyThread::closeThread()
{
    isStop = true;
}

void MyThread::run()
{
    while (1)
    {
        if(isStop)
            return;
        qDebug()<<tr("mythread QThread::currentThreadId()==")<<QThread::currentThreadId();
        qDebug()<<"66";
        sleep(1);
    }
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#pragma execution_character_set("utf-8")
#include <QWidget>
#include <mythread.h>
#include <QPushButton>
#include <QVBoxLayout>
#include <QMutex>
#include <ui_widget.h>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();


    Ui::Widget *ui;

    Ui::Widget *getUi() const;
    void setUi(Ui::Widget *newUi);

signals:
    void uiChanged();

private slots:
    void openThreadBtnSlot();
    void closeThreadBtnSlot();
    void finishedThreadBtnSlot();
//    void testBtnSlot();

private:
    QVBoxLayout *mainLayout;
    MyThread *thread1;
    Q_PROPERTY(Ui::Widget * ui READ getUi WRITE setUi NOTIFY uiChanged)
};

#endif // WIDGET_H


widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <windows.h>
#include<ui_widget.h>

Widget::Widget(QWidget *parent)
    : QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->openThreadBtn,SIGNAL(clicked(bool)),this,SLOT(openThreadBtnSlot()));
    connect(ui->closeThreadBtn,SIGNAL(clicked(bool)),this,SLOT(closeThreadBtnSlot()));
    //connect(thread1,SIGNAL(finished()),this,SLOT(finishedThreadBtnSlot()));
}


Ui::Widget *Widget::getUi() const
{
    return ui;
}

void Widget::setUi(Ui::Widget *newUi)
{
    if (ui == newUi)
        return;
    ui = newUi;
    emit uiChanged();
}

void Widget::openThreadBtnSlot()
{
    //開啟一個(gè)線程
    thread1 = new MyThread;
    thread1->start();
    qDebug()<<"thread id:"<<QThread::currentThreadId();
}

void Widget::closeThreadBtnSlot()
{
    //關(guān)閉多線程
    thread1->closeThread();
    connect(thread1,SIGNAL(finished()),this,SLOT(finishedThreadBtnSlot()));
    thread1->quit();
    thread1->wait();

}

void Widget::finishedThreadBtnSlot()
{
    qDebug()<<tr("完成信號(hào)finished觸發(fā)");
}

Widget::~Widget()
{
}

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

注意在widget.ui里面添加兩個(gè)按鈕openThreadBtn和closeThreadBtn控制線程的開啟和結(jié)束。文章來源地址http://www.zghlxwxcb.cn/news/detail-632412.html

到了這里,關(guān)于【QT多線程一】繼承QThread,重寫run函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Qt】QThread & moveTothread-多線程的兩種實(shí)現(xiàn)方法

    【Qt】QThread & moveTothread-多線程的兩種實(shí)現(xiàn)方法

    一、如何理解多線程 二、實(shí)現(xiàn)多線程的兩種方式(面向應(yīng)用) 2.1 繼承 QThread 的類 2.2 (推薦這種方式)函數(shù) moveTothread() 三、多線程的釋放問題(善后工作) 類似我們單片機(jī)的編程,如在 Keil5 中對 51 單片機(jī)或者 STM32 單片機(jī)進(jìn)行編程時(shí),如果我們使用模塊化編程,那么 main.c 文

    2024年02月01日
    瀏覽(18)
  • QT中Qthread線程徹底銷毀的實(shí)例與注意事項(xiàng)(防止線程資源內(nèi)存泄露)

    ?注意: 釋放線程的時(shí)候觸發(fā)線程的信號(hào)與槽連接時(shí)的連接類型參數(shù)一定要是Qt::ConnectionType::DirectConnection, 否則線程銷毀不了會(huì)造成內(nèi)存泄露,通過任務(wù)欄開啟資源管理器可監(jiān)視cup的線程數(shù)變化情況。 QThread* th=new QThread(); ? ? ? ? ? Work* mywork=new Work (); ? ? ? ? ? mywork-move

    2024年02月02日
    瀏覽(23)
  • Qt+C++多線程thread-QThread-QTimer視頻-控件動(dòng)畫-混合應(yīng)用實(shí)例

    Qt+C++多線程thread-QThread-QTimer視頻-控件動(dòng)畫-混合應(yīng)用實(shí)例

    程序示例精選 Qt+C++多線程thread-QThread-QTimer混合應(yīng)用實(shí)例 如需安裝運(yùn)行環(huán)境或遠(yuǎn)程調(diào)試,見文章底部個(gè)人 QQ 名片,由專業(yè)技術(shù)人員遠(yuǎn)程協(xié)助! 這篇博客針對Qt+C++多線程thread-QThread-QTimer混合應(yīng)用實(shí)例編寫代碼,代碼整潔,規(guī)則,易讀。 學(xué)習(xí)與應(yīng)用推薦首選。 功能:多線程thr

    2024年02月16日
    瀏覽(26)
  • 13-1_Qt 5.9 C++開發(fā)指南_多線程及QThread 創(chuàng)建多線程程序_ThreadSignal

    13-1_Qt 5.9 C++開發(fā)指南_多線程及QThread 創(chuàng)建多線程程序_ThreadSignal

    一個(gè)應(yīng)用程序一般只有一個(gè)線程,一個(gè)線程內(nèi)的操作是順序執(zhí)行的,如果有某個(gè)比較消耗時(shí)間的計(jì)算或操作,比如網(wǎng)絡(luò)通信中的文件傳輸,在一個(gè)線程內(nèi)操作時(shí),用戶界面就可能會(huì)凍結(jié)而不能及時(shí)響應(yīng)。這種情況下,可以創(chuàng)建一個(gè)單獨(dú)的線程來執(zhí)行比較消耗時(shí)間的操作,并與

    2024年02月14日
    瀏覽(16)
  • QThread: Destroyed while thread is still running——線程正在運(yùn)行時(shí)銷毀了線程

    QThread: Destroyed while thread is still running——線程正在運(yùn)行時(shí)銷毀了線程 在編寫多線程程序時(shí),可能會(huì)遇到“QThread: Destroyed while thread is still running”這個(gè)錯(cuò)誤。這個(gè)錯(cuò)誤表示在一個(gè)線程仍在運(yùn)行時(shí),它被銷毀了。 一個(gè)常見的情況是,當(dāng)一個(gè)線程正在執(zhí)行某些操作時(shí),它被強(qiáng)制銷

    2024年02月15日
    瀏覽(26)
  • Qt QThread的moveToThread方法使用

    Qt QThread的moveToThread方法使用

    從 Qt4.4 版本之后,因?yàn)?QThread 的 run 方法創(chuàng)建新線程這樣實(shí)現(xiàn)與 Qt 設(shè)計(jì)的理念不符,Qt 主推使用 moveToThread 方法來創(chuàng)建新線程。 QThread應(yīng)該被看做是操作系統(tǒng)線程的接口或控制點(diǎn),而不應(yīng)該包含需要在新線程中運(yùn)行的代碼。需要運(yùn)行的代碼應(yīng)該放到一個(gè)QObject的子類中,然后將

    2024年02月14日
    瀏覽(16)
  • CMake+QT+大漠插件的桌面應(yīng)用開發(fā)(QThread)

    CMake+QT+大漠插件的桌面應(yīng)用開發(fā)(QThread)

    在CMake+QT+大漠插件的桌面應(yīng)用開發(fā)中已經(jīng)給出了 QT 配合 大漠插件 開發(fā)桌面應(yīng)用的樣例 不過由于主窗口的UI操作和大漠的調(diào)用是在一個(gè)線程里面的,所以當(dāng)大漠調(diào)用時(shí)間過長時(shí)會(huì)出現(xiàn)UI界面卡頓的現(xiàn)象 我們可以利用子線程處理耗時(shí)操作,處理完后再由主線程(UI線程)更新界

    2024年01月18日
    瀏覽(21)
  • QT QThread +信號(hào)量 實(shí)現(xiàn)生成者和消費(fèi)者

    //本文詳細(xì)描述QT 中QThread +信號(hào)量 實(shí)現(xiàn)生成者和消費(fèi)者。 //調(diào)試通過。 //這個(gè)例子演示了怎樣使用QSemaphore 信號(hào)量來保護(hù)對生成者線程和消費(fèi)者線程共享的環(huán)形緩沖 //區(qū)的訪問。 //生成者向緩沖區(qū)中寫入數(shù)據(jù),直到達(dá)到緩沖區(qū)的終點(diǎn),這時(shí)它會(huì)從起點(diǎn)重新開始,覆蓋已經(jīng)存在

    2024年04月14日
    瀏覽(17)
  • Qt不能在線程函數(shù)操作UI

    ??Qt的官方文檔雖然并沒有明確說明,不能在子線程中操作UI,但是,因?yàn)镼t是事件循環(huán)機(jī)制,所有的UI事件都是在主線程中處理的,如果在子線程中直接操作UI,就會(huì)存在線程安全問題,嚴(yán)重時(shí)候會(huì)使程序掛掉。 ??但是有些場景確實(shí)需要在子線程中操作UI怎么辦?以下是幾

    2024年02月03日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包