1. 程式人生 > >QT C++實現多執行緒通訊--示例程式碼

QT C++實現多執行緒通訊--示例程式碼

</pre><p></p><pre name="code" class="cpp">先看測試程式碼:
main.cpp
#include "mainwindow.h"
#include <QApplication>
//#include<mythreaad.h>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

 //   mythreaad my;
 //   my.start();
  //  QObject::connect(&my,SIGNAL(MySignal(QString)),&w,SLOT(myreceiveslots(QString)));



 //   QObject::connect(&w,SIGNAL(mainSignal(int)),&my,SLOT(mythreadrec(int)));
    return a.exec();
}


mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<qthread.h>
#include<mythreaad.h>

//#include<data.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void generateData();

signals:
    void mainSignal(mydataTrans);




private:
    mythreaad *tre;
    Ui::MainWindow *ui;
	mydataTrans *mydata;
	
};



#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<qmessagebox.h>
#include<qdebug.h>
#include<string>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tre=new mythreaad();
    tre->start();
	
	QObject::connect(this, SIGNAL(mainSignal(mydataTrans)), tre, SLOT(mythreadrec(mydataTrans)));
//    QObject::connect(tre,SIGNAL(MySignal(int )),this,SLOT(MainRecei(int)));
	this->generateData();

   // this->moveToThread(tre);

}

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

void MainWindow::generateData()
{
	mydata = new mydataTrans();
	mydata->id = 9;  
	mydata->name = "chenshuyi ";
	
	//mydata->age = 26;
	emit(mainSignal(*mydata));
   
}


#ifndef MYTHREAAD_H
#define MYTHREAAD_H

#include<qthread.h>
#include<qstring.h>
#include"mydataTrans.h"

class mythreaad:public QThread
{
    Q_OBJECT
public:
    mythreaad();
    void run();
    int handleInt(int);
signals:
   void MySignal(int );
public slots:
   void mythreadrec(mydataTrans);
public:
	mydataTrans mydata2;
};

#endif // MYTHREAAD_H

#include "mythreaad.h"
#include"qstring.h"
#include<qdebug.h>

mythreaad::mythreaad()
{

}

void mythreaad::run()
{

//   qDebug()<<"thread running";
//  exec();

}

void mythreaad::mythreadrec(mydataTrans  mydata1)
{

  qDebug()<<"hello wolrd\n";
  qDebug() << QString::number(mydata1.id);
  qDebug() << QString::fromStdString(mydata1.name);



//  qDebug() << QString::number(mydata1.age);


  system("pause");
//   num=handleInt(num);
//   emit(MySignal(num));

}

int mythreaad::handleInt(int num)
{
    return num*2;
}


#pragma once
#include<string>
using namespace std;
class mydataTrans
{
public:
	mydataTrans();
	~mydataTrans();
	int id;
	string name;
};




#include "mydataTrans.h"


mydataTrans::mydataTrans()
{
}


mydataTrans::~mydataTrans()
{
}

分別是主執行緒類,子執行緒類,要求處理的資料型別類,主執行緒傳出資料型別類給子執行緒進行相應處理,相同的辦法,子執行緒也可以把傳出結果傳給主執行緒顯示(這部分程式碼不給出)。