QT C++實現多執行緒通訊--示例程式碼
阿新 • • 發佈:2019-02-13
</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()
{
}
分別是主執行緒類,子執行緒類,要求處理的資料型別類,主執行緒傳出資料型別類給子執行緒進行相應處理,相同的辦法,子執行緒也可以把傳出結果傳給主執行緒顯示(這部分程式碼不給出)。