线程.Qt更新界面

摘要:
1.信号和时隙机制可以是ZC:个体临时测试它,类似于PostMessage(…)方法:a,它在各自的线程中执行代码;b、 调用emit并不需要时间(这意味着它就像调用PostMessage(…)一样。在特定插槽中需要执行多长时间与“emit??()”无关)2,测试代码:2.1,h#ifndefMAINWINDOW_h#defineMAINWINDOW_h#include˂QMa

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、界面

  线程.Qt更新界面第1张

 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、

免责声明:文章转载自《线程.Qt更新界面》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ftpclient 遇到的一些问题dubbo心跳机制 (1)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

dup和dup2用法小结

今天和同学探讨了一下关于重定向输出到文件的问题,其中需要用到dup和dup2函数,因此来小小的总结一下。 首先来man一下: dup直接返回一个新的描述符和原来的描述符一样代表同一个资源,描述符的值就从当前未使用的最小的描述符来取。而dup2则是可以指定描述符的值,这样通过把文件的描述符指定为STDOUT_FILENO,这样就相当于重定向输出为文件了。...

ATL中使用CString

在stdafx.h 中的 #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的 下添加一下代码即可: #define _WTL_NO_CSTRING #include <atlstr.h> #define _WTL_NO_WTYPES #include <at...

makefile学习经验(四)编译生成动态库文件(方式二)

Lunix下生成动态库文件:          之前已经介绍了依靠makefile文件实现可执行文件,下面说下在源文件中指定加载的动态库文件; 一.   源码文件: datetime.h:  #ifndef __DATETIME_H  #define __DATETIME_H /* 日期结构 */  typedef struct  {          i...

linux 应用程序直接读写寄存器或物理内存

1.程序说明: 调试驱动程序时,经常遇到候需要查看或设置寄存器的情况,但是直接更改内核代码又不方便。 这里提供一个应用程序源码能在应用层访问底层寄存器。(网上找到的,进行过更改)。 这里只提供4字节数据的访问,如果需要其他字节宽度则需要更改代码。 line40 增加了O_DSYNC标志,防止cache导致数据写入不及时。 2.应用程序源码 1 #incl...

python【第五篇】常用模块学习

1.模块 a.定义:本质就是.py结尾的python文件,逻辑上组织python代码,实现某种功能。例:文件名test.py-->模块名test。 b.导入方法:imort moduname                 from mdname import *                 from mdname import name as...

BZOJ 3217: ALOEXT (块状链表套trie)

第一次写块状链表,发现还挺好写的,但是一点地方写错加上强制在线就会各种姿势WA/TLE/RE爆… 想法就是分块后,在每一个块上维护最大值和次大值,还在每一个块上维护一棵trie树来求异或最大值.散块直接暴力…这想法暴力吧…这道题不用考虑合并,因为最多分出(n+q)/Bsz块.详细的做法如下 对于修改一个数,首先在该块的trie数中删除该数(直接伪删,也就是...