前言:
转载请附上连接,本帖原创请勿照抄。
线程源文件mythread.h、.cpp;主线程文件mainwindow.h、.cpp;
下面程序先从主线程调用子线程,子线程给主线程返回1;主线程再给子线程发送带参信号子线程打印收到的信号。
mythread.h
class mythread : public QThread
{
Q_OBJECT
public:
mythread();
//QThread的虚函数
//线程处理函数
//不能直接调用,通过start()间接调用
void run();
signals:
void isDone(int); //处理完成信号
public slots:
//接收主线程的消息
void recMegFromMain(QString);
};
mythread.cpp
mythread::mythread()
{
}
void mythread::run()
{
emit isDone(1); //发送完成信号
}
void mythread::recMegFromMain(QString str)
{
qDebug()<< "子线程接收到" <<str;
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "mythread.h"
#include <QDebug>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
//接收子线程槽函数
void receiveMsgFromThread(int);
//子线程发射信号槽函数
void sengMsgToThreadBtn();
//分配空间
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
private:
Ui::MainWindow *ui;
mythread *thread;
signals:
//给子线程发消息
void sengMsgToThread(QString);
};
#endif // MAINWINDOW_H
mainwindow.cpp
//构造函数部分
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
thread = new mythread; //分配空间
consumer = new WriterThread; //分配空间
writer = new Consumer;
//关闭界面时,杀死线程
connect(this, &MainWindow::destroyed, this, &MainWindow::dealDone);
//接收子线程发来的数据
connect(thread, &mythread::isDone, this, &MainWindow::receiveMsgFromThread);
//发数据给子线程
connect(this, &MainWindow::sengMsgToThread, thread, &mythread::recMegFromMain);
}
//主线程调用函数,触发信号给子线程发消息
void MainWindow::on_pushButton_clicked()
{
sengMsgToThreadBtn();
}
//给子线程发信号和参数
void MainWindow::sengMsgToThreadBtn()
{
emit sengMsgToThread("hello");
}
//接收子线程函数
void MainWindow::receiveMsgFromThread(int i)
{
QString str = QString::number(i);
qDebug()<<str;
}
//启动线程
void MainWindow::on_pushButton_2_clicked()
{
thread->start();
//启动线程,处理数据
ui->label->setText("线程启动");
}
//停止线程调用
void MainWindow::dealDone()
{
ui->label->setText("线程停止");
//停止线程
thread->quit();
//consumer->quit();
//writer->quit();
//等待线程处理完手头工作
thread->wait();
//consumer->wait();
//writer->wait();
ui->pushButton_2->setEnabled(true);
ui->pushButton->setEnabled(false);
}