線程.Qt更新界面


1、信號&槽 機制 即可

 ZC:個人暫時 測試下來,類似是 PostMessage(...)的方式:

  a、是在各自的線程中執行代碼,

  b、調用 emit不耗時(指的意思是 像調用PostMessage(...)一樣 扔完就算,具體 slot中需要執行多久 不關“emit ???()”的事)

2、測試代碼:

 2.1、h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QThread>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:

    void slot01();

    void on_pushButton_3_clicked();

private:
    Ui::MainWindow *ui;

    int FiCnt;
public:
    void UpdateCnt();
};


class TthreadZ :public QThread
{
    Q_OBJECT
public:
    explicit TthreadZ(QObject *parent = 0){}
    ~TthreadZ(){}

protected:
    void run();

signals:
    void signal01();

};

#endif // MAINWINDOW_H

 2.2、cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "UdpSocket_ClientZ.h"

#include <QThread>
#include <Windows.h>



MainWindow *g_pMainWindow = nullptr;

void TthreadZ::run()
{
    while (1)
    {
        DWORD dwThreadId = ::GetCurrentThreadId();


        DWORD dw1 = ::GetTickCount();
        emit signal01();
        DWORD dw2 = ::GetTickCount();

        qDebug() << "TthreadZ.dwThreadId : " << dwThreadId << ". Take time : " << dw1 << " --> " << dw2 << " : " << (dw2-dw1)<<"ms";

//        if (g_pMainWindow != nullptr)
//            g_pMainWindow->UpdateCnt();

        Sleep(1000);
        qDebug() << "";
    }
}

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

    g_pMainWindow = this;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slot01()
{
    DWORD dwThreadId = ::GetCurrentThreadId();

    DWORD dw1 = ::GetTickCount();
    UpdateCnt();
    DWORD dw2 = ::GetTickCount();

    qDebug() << "MainWindow.dwThreadId : " << dwThreadId << ". Take time : " << dw1 << " --> " << dw2 << " : " << (dw2-dw1)<<"ms";
}

void MainWindow::UpdateCnt()
{
    FiCnt ++;
    ui->plainTextEdit->appendPlainText(QString::number(FiCnt));
    Sleep(500);
}

void MainWindow::on_pushButton_3_clicked()
{
    qDebug() << "on_pushButton_3_clicked(1)";
    //UpdateCnt();
    TthreadZ* p = new TthreadZ();
    p->start();

    qDebug() << "on_pushButton_3_clicked(2)";
    connect(p, &TthreadZ::signal01, this, &MainWindow::slot01);// ZC: 注意這里的參數 函數指針
}

 2.3、界面

  

 

 2.4、控制台輸出

on_pushButton_3_clicked(1)
on_pushButton_3_clicked(2)
TthreadZ.dwThreadId :  5344 . Take time :  3605015  -->  3605015  :  0 ms
MainWindow.dwThreadId :  4468 . Take time :  3605015  -->  3605515  :  500 ms

TthreadZ.dwThreadId :  5344 . Take time :  3606015  -->  3606015  :  0 ms
MainWindow.dwThreadId :  4468 . Take time :  3606015  -->  3606515  :  500 ms

TthreadZ.dwThreadId :  5344 . Take time :  3607015  -->  3607015  :  0 ms
MainWindow.dwThreadId :  4468 . Take time :  3607015  -->  3607515  :  500 ms

TthreadZ.dwThreadId :  5344 . Take time :  3608015  -->  3608015  :  0 ms
MainWindow.dwThreadId :  4468 . Take time :  3608015  -->  3608531  :  516 ms

TthreadZ.dwThreadId :  5344 . Take time :  3609015  -->  3609015  :  0 ms
MainWindow.dwThreadId :  4468 . Take time :  3609015  -->  3609531  :  516 ms

 

3、

4、

5、

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM