QT 多線程信號與槽(二)

一個主線程,一個次線程,主線程向次線程發送信號

mythread.h

#include <QThread>
#include <QDebug>
class Mythread : public QThread
{
    Q_OBJECT
public:
    Mythread();
protected:
    void run();
private:

public slots:
    void receive_main_signal(int);
};
mythread.cpp

#include "mythread.h"
#include <QDebug>
Mythread::Mythread()
{
    qDebug()<<"Mythread:" <<QThread::currentThreadId();
    //moveToThread(this);

}

void Mythread::run()
{
    qDebug()<<"run:" <<QThread::currentThreadId();
    exec();
}
void Mythread::receive_main_signal(int a)
{
    qDebug()<<"from MainWindow:" <<QThread::currentThreadId();
    qDebug()<<"i="<<a;
}
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;
signals:
    void emit_signal_to_thread(int);
public slots:
    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);
    qDebug()<<"MainWindow:" <<QThread::currentThreadId();
    connect(this,SIGNAL(emit_signal_to_thread(int)),&thread,SLOT(receive_main_signal(int)));//主線程給次線程發消息
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(start_thread()));
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::start_thread()
{
    thread.start();
    int i;
    for(i=0;i<10;i++)
    {
        emit emit_signal_to_thread(i);
        sleep(1);
    }
}
打印結果:
Mythread: 3063412432 
MainWindow: 3063412432 
from MainWindow: 3063412432 
i= 0 
run: 3018308496 
from MainWindow: 3063412432 
i= 1 
from MainWindow: 3063412432 
i= 2 
from MainWindow: 3063412432 
i= 3 
from MainWindow: 3063412432 
i= 4 
from MainWindow: 3063412432 
i= 5 
from MainWindow: 3063412432 
i= 6 
from MainWindow: 3063412432 
i= 7 
from MainWindow: 3063412432 
i= 8 
from MainWindow: 3063412432 
i= 9 
結論:主線程向子線程發送信號,子線程對應的槽函數實現還是在主線程中完成的。如何使子線程的槽函數在子線程中完成呢?可以將mythread.cpp中moveToThread(this)的//去掉,最後可以顯示:
Mythread: 3064174288 
MainWindow: 3064174288 
run: 3019070352 
from MainWindow: 3019070352 
i= 0 
from MainWindow: 3019070352 
i= 1 
from MainWindow: 3019070352 
i= 2 
from MainWindow: 3019070352 
i= 3 
from MainWindow: 3019070352 
i= 4 
from MainWindow: 3019070352 
i= 5 
from MainWindow: 3019070352 
i= 6 
from MainWindow: 3019070352 
i= 7 
from MainWindow: 3019070352 
i= 8 
from MainWindow: 3019070352 
i= 9 
可見子線程的槽函數在新線程中運行了,沒有出現在主線程中。但這種方法是被Bradley T. Hughes所唾棄的,所以還是用大家公認爲比較對的方法吧。(見下篇)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章