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

Qt QThread的moveToThread方法使用

這篇具有很好參考價值的文章主要介紹了Qt QThread的moveToThread方法使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

Qt線程簡介

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

  1. 創(chuàng)建一個繼承QObject類的對象object,創(chuàng)建一個線程QThread對象thread。
  2. 創(chuàng)建主線程中對象 M 與類對象object鏈接的信號槽。
  3. 通過類對象object的moveToThread方法將類對象object移動到線程對象thread中。
  4. 調(diào)用線程對象thread的start方法,啟動線程。
  5. 對象 M 調(diào)用信號槽,類對象 obj 在新線程thread中處理數(shù)據(jù)(調(diào)用新線程只能通過信號槽來完成,如果要將類對象 obj 的數(shù)據(jù)傳回給對象 M,可以由 obj 發(fā)起對 M 的信號槽)。

具體代碼如下:

1:要放入新線程的Worker類

h 文件:

#ifndef WORKER_H
#define WORKER_H

#include <QObject>

/*****************************************************************************************
  @copyright 2013-2020
  @author    qiaowei
  @contact   weiweiqiao@126.com
  @version   1.0
  @date      2021-01-09
  @brief     工人類,主要方法do_something打印工人對象所在線程的id
******************************************************************************************/
class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr);

signals:
    /***************************************************************************
     @author   qiaowei
     @version  1.0
     @date     2021-01-24
     @brief    調(diào)用Controller::print_thread方法
    ***************************************************************************/
    void result_ready(const QString& content);

public slots:
    /***************************************************************************
     @author   qiaowei
     @version  1.0
     @date     2021-01-07
     @brief    打印Worker對象所在線程id
    ***************************************************************************/
    void do_something();

};

#endif // WORKER_H

cpp 文件:

#include <QtDebug>
#include <QThread>
#include "worker.h"

Worker::Worker(QObject *parent) : QObject(parent)
{

}

void Worker::do_something()
{
    emit result_ready("Hello");

//    int i(0);
//    while (i < 20) {
//        qDebug() << "I'm working in Worker's thread:" << (quint64) QThread::currentThreadId();
//        ++i;
//    }
    qDebug() << "I'm working in Worker's thread:" << (quint64) QThread::currentThreadId();
}

2:操縱Worker類對象的Controller類

h 文件:

#ifndef CONTROLLER_H
#define CONTROLLER_H

#include <QObject>

QT_BEGIN_NAMESPACE
class Worker;
QT_END_NAMESPACE

/*****************************************************************************************
  @copyright 2013-2020
  @author    qiaowei
  @contact   weiweiqiao@126.com
  @version   1.0
  @date      2021-01-06
  @brief     控制線程創(chuàng)建、啟動
******************************************************************************************/
class Controller : public QObject
{
    Q_OBJECT
public:
    explicit Controller(QObject *parent = nullptr);

    ~Controller();

    /***************************************************************************
     @author   qiaowei
     @version  1.0
     @date     2021-01-06
     @brief    將對象worker_移入子線程work_thread_,啟動子線程
    ***************************************************************************/
    void move_work_to_thread();

signals:
    /***************************************************************************
     @author   qiaowei
     @version  1.0
     @date     2021-01-07
     @brief    調(diào)用worker_::do_something方法
    ***************************************************************************/
    void start_running();

public slots:
    void print_thread() const;

private:
    void setup_connections();

    void print_thread_id() const;

private:
    /***************************************************************************
     @author   qiaowei
     @version  1.0
     @date     2021-01-07
     @brief    子線程
    ***************************************************************************/
    QThread* work_thread_;

    /***************************************************************************
     @author   qiaowei
     @version  1.0
     @date     2021-01-07
     @brief    放入子線程work_thread_的對象worker_
    ***************************************************************************/
    Worker* worker_;
};

#endif // CONTROLLER_H

cpp 文件:

#include <QThread>
#include <QtDebug>
#include "controller.h"

#include "worker.h"

Controller::Controller(QObject *parent) :
    QObject(parent),
    work_thread_(new QThread()),
    worker_(new Worker())
{
    setup_connections();

    print_thread_id();

    move_work_to_thread();
}

Controller::~Controller()
{
    work_thread_->quit();
    work_thread_->wait();

    delete work_thread_;

    if (nullptr == work_thread_) {
        qDebug()<< "nullptr";
    } else {
        work_thread_ = nullptr;
    }
}

void Controller::move_work_to_thread()
{
    worker_->moveToThread(work_thread_);

    // 啟動子線程。不啟動子線程,worker_對象的方法不會被調(diào)用(因?yàn)檫\(yùn)行的環(huán)境沒啟動)
    work_thread_->start();
}

void Controller::print_thread() const
{
//    int i(0);
//
//    while (i < 20) {
//        print_thread_id();
//        ++i;
//    }
    print_thread_id();
}

void Controller::setup_connections()
{
    connect(this,
            &Controller::start_running,
            worker_,
            &Worker::do_something);

    connect(worker_,
            &Worker::result_ready,
            this,
            &Controller::print_thread);
}

void Controller::print_thread_id() const
{
    qDebug()<< "Controller::Controller = " << (quint64) QThread::currentThreadId();
}

觸發(fā)線程的ui類

h 文件:

#ifndef CONTROLLER_DIALOG_H
#define CONTROLLER_DIALOG_H

#include <QDialog>

QT_BEGIN_NAMESPACE
class Controller;
QT_END_NAMESPACE

namespace Ui {
class Controller_dialog;
}

/*****************************************************************************************
  @copyright 2013-2020
  @author    qiaowei
  @contact   weiweiqiao@126.com
  @version   1.0
  @date      2021-01-09
  @brief     操作多線程的ui
******************************************************************************************/
class Controller_dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Controller_dialog(QWidget *parent = nullptr);
    ~Controller_dialog();

private:
    void setup_connections();

private:
    Ui::Controller_dialog *ui;

    Controller* controller_;
};

#endif // CONTROLLER_DIALOG_H

cpp 文件:

#include "controller_dialog.h"
#include "ui_controller_dialog.h"

#include "controller.h"

Controller_dialog::Controller_dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Controller_dialog),
    controller_(new Controller())
{
    ui->setupUi(this);

    setup_connections();
    setFixedSize(sizeHint());
}

Controller_dialog::~Controller_dialog()
{
    delete ui;
    delete controller_;
}

void Controller_dialog::setup_connections()
{
    // 啟動新線程
    connect(ui->start_button_,
            &QPushButton::clicked,
            controller_,
            &Controller::start_running);

    // 關(guān)閉所有窗體,退出程序
    connect(ui->quit_button_,
            &QPushButton::clicked,
            qApp,
            &QApplication::closeAllWindows);
}

界面 ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Controller_dialog</class>
 <widget class="QDialog" name="Controller_dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>219</width>
    <height>83</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0">
    <layout class="QHBoxLayout" name="horizontalLayout">
     <item>
      <widget class="QPushButton" name="start_button_">
       <property name="text">
        <string>Start Button</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="quit_button_">
       <property name="text">
        <string>Quit</string>
       </property>
      </widget>
     </item>
    </layout>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

main 文件:

#include <QApplication>

#include "mainwindow.h"
#include "thread_dialog.h"
#include "controller_dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Controller_dialog d;
    d.show();

    return a.exec();
}

運(yùn)行結(jié)果,打印Print_thread、Worker對象的線程號:

Qt QThread的moveToThread方法使用,Qt&amp;Pyside,C&amp;C++,qt,開發(fā)語言,c++

?可以看到打印結(jié)果,Worker 對象在線程 9480,主程序入口在線程 5336文章來源地址http://www.zghlxwxcb.cn/news/detail-630350.html

到了這里,關(guān)于Qt QThread的moveToThread方法使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【Python之Pyside】如何在pycharm中使用pyside開發(fā)編輯Qt ui界面(uic、rcc)

    【Python之Pyside】如何在pycharm中使用pyside開發(fā)編輯Qt ui界面(uic、rcc)

    qtcreator自帶designer設(shè)計師編輯器,非常好用。 但是我們使用pycharm進(jìn)行界面開發(fā)的時候沒有designer,在pycharm中直接雙擊qt的ui文件會直接進(jìn)行xml格式的編輯。 要在pycharm中支持雙擊ui文件打開qtdesigner,我們需要先 在pycharm中添加安裝了pyside6的python環(huán)境,注意,安裝pyqt5不支持,舊

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

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

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

    2024年02月14日
    瀏覽(16)
  • QT -- 多線程 —— moveToThread

    QT -- 多線程 —— moveToThread

    視頻教程鏈接: https://www.bilibili.com/video/BV1fL4y1V7QP/?spm_id_from=333.880.my_history.page.clickvd_source=b91967c499b23106586d7aa35af46413 moveToThread函數(shù)的功能:給多個任務(wù)(比如顯示多個界面)各分配一個線程去執(zhí)行。這樣就避免了自定義好多個類繼承自QThread類,從而可以避免冗余。 翻譯:更改

    2024年01月25日
    瀏覽(13)
  • qt之movetothread理解

    qt的下線程qthread,每個線程都有自己的事件循環(huán)exec。 對象的線程上下文,每個對象都有自己的線程上下文,怎么理解呢,就是該對象在哪個線程創(chuàng)建,其線程上下文就是誰。 每個qobject對象在創(chuàng)建時都有包含線程成員,threaddata,該成員的類型是QThreadData,該成員與qobject對象

    2024年02月09日
    瀏覽(23)
  • Qt:moveToThread

    該函數(shù)屬于QObject,因此任何繼承于QObject的對象都可以使用該函數(shù)。 使用該函數(shù)可以減少主線程界面刷新的壓力 官方解釋: 1: 更改此對象及其子對象的線程相關(guān)性。如果對象有父對象,則無法移動該對象。事件處理將在targetThread中繼續(xù)。 解釋:每一個QObject對象都有事件循

    2024年02月12日
    瀏覽(12)
  • 【QT5-自我學(xué)習(xí)-線程qThread練習(xí)-兩種使用方式-1:通過繼承線程類來使用-基礎(chǔ)樣例】

    【QT5-自我學(xué)習(xí)-線程qThread練習(xí)-兩種使用方式-1:通過繼承線程類來使用-基礎(chǔ)樣例】

    學(xué)習(xí)線程其實(shí)有一段時間了,當(dāng)時只是學(xué)習(xí),沒有實(shí)際用起來,最近做的一個qt程序,發(fā)現(xiàn)如果不使用線程,那么就會導(dǎo)致界面卡死,這樣才體現(xiàn)出線程的實(shí)際作用。 發(fā)現(xiàn)卡頓的程序就是前幾天說到的“【QT調(diào)用ST-link-使用QT編寫程序-調(diào)用ST-LINK_CLI.exe-燒寫STM32F4xxx-基礎(chǔ)樣例】”

    2024年02月11日
    瀏覽(29)
  • QT學(xué)習(xí)之旅 - QThread多線程

    其實(shí)QT中的thread(線程)是很容易的 首先是主線程 其次是一個程序 通過一個QThread來放入程序 一個簡單的線程就實(shí)現(xiàn)了 進(jìn)階一點(diǎn): 手動開啟關(guān)閉線程 添加一個按鍵,通過 信號和槽 來控制線程使能關(guān)閉 Test不變。 現(xiàn)象 是 mainwindow i:99(執(zhí)行完) 后窗口出現(xiàn),之后 開啟線程 。開啟后

    2024年02月16日
    瀏覽(16)
  • PyCharm下安裝配置PySide6開發(fā)環(huán)境(Qt Designer、PyUIC和PyRCC)

    PyCharm下安裝配置PySide6開發(fā)環(huán)境(Qt Designer、PyUIC和PyRCC)

    本篇我們來介紹一下在PyCharm中如何安裝和配置PySide6的開發(fā)運(yùn)行環(huán)境。 開發(fā)PySide6項(xiàng)目,我們可以使用Qt Designer、PyUIC和PyRCC這些好用的外部工具。 Qt Designer是啥東西?簡單的來說就是設(shè)計Qt界面的輔助開發(fā)工具,可以像開發(fā)VB那樣通過拖拽的方式進(jìn)行所見即所得的可視化開發(fā)G

    2023年04月08日
    瀏覽(22)
  • 02、Pycharm中配置PyQt/PySide開發(fā)工具Qt Designer、PyUIC、PyRcc(詳細(xì))

    02、Pycharm中配置PyQt/PySide開發(fā)工具Qt Designer、PyUIC、PyRcc(詳細(xì))

    上一篇文章: 01、Pyqt/PySide6簡介及安裝方法 PySide6、PyQt5 都是基于Qt 庫。Qt庫里面有非常強(qiáng)大的圖形界面開發(fā)庫,但是Qt庫是C++語言開發(fā)的,PySide2、PySide6、PyQt5可以讓我們通過Python語言使用Qt https://blog.csdn.net/python_sy/article/details/127425142 目錄 前言 一、Qt Designer、PyUic、PyRcc是什么

    2023年04月14日
    瀏覽(30)
  • PyCharm下安裝配置PySide6開發(fā)環(huán)境(Qt Designer(打開,編輯)、PyUIC和PyRCC)

    PyCharm下安裝配置PySide6開發(fā)環(huán)境(Qt Designer(打開,編輯)、PyUIC和PyRCC)

    python安裝路徑 ?pycharm安裝路徑: python系統(tǒng)變量: pycharm環(huán)境變量: ? 注意:正常安裝,并勾選ADD PATH一般會自動配好 用pycharm開發(fā)python項(xiàng)目時,使用虛擬環(huán)境的好處是: 可以為不同的項(xiàng)目創(chuàng)建不同的python環(huán)境,避免了依賴包和版本的沖突。 可以為同一個項(xiàng)目的不同環(huán)境(如

    2024年02月11日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包