QT 多線程信號與槽(一)

1.一個主界面(主線程),一個次線程,次線程通過信號向主線程傳遞遞增變量,主線程將它顯示出來

mythread.h

#include <QThread>
#include <QDebug>
class Mythread : public QThread
{
    Q_OBJECT
public:
    Mythread();
protected:
    void run();
private:
    int i;
signals:
    void signal_add_int(QString);
};
mythread.cpp

#include "mythread.h"
#include <QDebug>
Mythread::Mythread()
{
    i = 0;
}

void Mythread::run()
{
    while(1)
    {
        i++;
        QString str = QString::number(i,10);
        emit signal_add_int(str);
        sleep(1);
        qDebug()<<"run thread:" <<QThread::currentThreadId();
    }
}
mainwindow.h
#include <QMainWindow>
#include "mythread.h"
namespace Ui {
    class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
    Mythread thread;
private slots:
    void set_lineEdit_text(QString);
    void start_thread();
};
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(&thread,SIGNAL(signal_add_int(QString)),this,SLOT(set_lineEdit_text(QString)),Qt::QueuedConnection);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(start_thread()));
    qDebug()<<"MainWindow:" <<QThread::currentThreadId();
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::set_lineEdit_text(QString str)
{
    ui->lineEdit->setText(str);
    qDebug()<<"from thread slot:" <<QThread::currentThreadId();
}
void MainWindow::start_thread()
{
    thread.start();
}
打印結果:
MainWindow: 3062654672 
from thread slot: 3062654672 
run thread: 3017550736 
from thread slot: 3062654672 
run thread: 3017550736 
from thread slot: 3062654672 
run thread: 3017550736 
from thread slot: 3062654672 
結論:
     主線程運行thread.start()後,次線程啓動,進入到次線程中,
     次線程發送信號給主線程,主線程接收到該信號,進入槽函數,該槽函數也在主線程中運行。
     次線程的開始和結束都在run函數中開始和結束
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章