zoukankan      html  css  js  c++  java
  • 第八十四课、多线程与界面组件的通信(上)------------------狄泰软件学院

    一、多线程与界面组件的通信

    1、GUI设计原则

    (1)、所有界面组件的操作都只能在主线程中完成

    (2)、因此,主线程也叫UI线程

    2、子线程对界面组件进行更新的解决方案-----信号与槽

    (1)、在子线程类中定义界面更新信号(updateUI)

    (2)、在窗口类中定义新界面组件的槽函数(setInfo)

    (3)、使用异步方式连接更新信号到槽函数(updateUI--->setInfo)

    A、子线程通过发射信号的方式更新界面组件

    B、所有界面组件对象只能依附主线程

    #ifndef MYTHREAD_H
    #define MYTHREAD_H
    
    #include <QThread>
    #include <QString>
    
    class MyThread : public QThread
    {
        Q_OBJECT
    public:
        explicit MyThread(QObject *parent = 0);
        
    signals:
        void UpdataUI(QString text);
    private:
        void run();
        
    public slots:
        
    };
    
    #endif // MYTHREAD_H
    MyThread.h
    #include "MyThread.h"
    #include<QString>
    
    MyThread::MyThread(QObject *parent) :
        QThread(parent)
    {
    }
    
    void MyThread::run()
    {
        emit UpdataUI("begin");
    
        for(int i=0; i<10; i++)
        {
            emit UpdataUI(QString::number(i));
            sleep(1);
        }
    
        emit UpdataUI("end");
    }
    MyThread.cpp
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QtGui/QWidget>
    #include <QPlainTextEdit>
    #include "MyThread.h"
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    private:
        QPlainTextEdit* m_plaintext;
        MyThread mythread;
    protected slots:
        void setInfo(QString text);
    public:
        Widget(QWidget *parent = 0);
        ~Widget();
    };
    
    #endif // WIDGET_H
    Widget.h
    #include "Widget.h"
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        m_plaintext = new QPlainTextEdit(this);
        m_plaintext->resize(160,160);
        m_plaintext->setReadOnly(true);
    
        connect(&mythread, SIGNAL(UpdataUI(QString)), this, SLOT(setInfo(QString)));
        mythread.start();
    }
    
    void Widget::setInfo(QString text)
    {
        m_plaintext->appendPlainText(text);
    }
    
    Widget::~Widget()
    {
        
    }
    mythread.cpp
    #include <QtGui/QApplication>
    #include "Widget.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;//依附于主线程,而发射信号的不依附主线程,故根据默认方式,这里已经是异步模式
        w.show();
        
        return a.exec();
    }

    二、小结

    (1)、现代GUI平台只允许在主线程中直接操作界面组件

    (2)、Qt中可以借助信号与槽的机制在子线程中操作界面组件

    (3)、进行信号与槽的连接时必须采用异步连接的方式

    (4)、界面组件对象必须依附于主线程 

  • 相关阅读:
    Shell之海量数据处理grep,cut,awk,sed
    [Linux] Migrate plugins and setting for vim
    [C++] Template
    c++ Dynamic Memory (part 2)
    Image process
    c++ Dynamic Memory (part 1)
    [Algorithm] A* Search Algorithm Basic
    [C++] Solve "No source available for main()" error when debugging on Eclipse
    [C++] Solve "Cannot run program "gdb": Unknown reason" error
    [C++] Solve "Launch Failed. Binary not found." error on Eclipse
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6503425.html
Copyright © 2011-2022 走看看