概述
Qt中使用多线程是通过connect关联信号和槽来实现子线程与主线程之间的数据传递与页面数据展示的,详细请看下面实例:
下面三行代码是实现主线程与子线程通信的信号连接。
//子线程运行了RUN()中的retrun之后会发出finished信号,来执行子线程中QObject::deleteLater方法
connect(&workerThread1, &QThread::finished, worker, &QObject::deleteLater);
//主线程发射信号子线程执行槽函数用于在子线程中进行处理运算
connect(this, &MainWindow::operate, worker, &Worker::doWork);
//子线程发射信号主线程执行槽函数用于在主线程中返回执行结果
connect(worker, &Worker::resultReady, this, &MainWindow::handleResults);
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QDateTime>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//子线程1
Worker *worker = new Worker;
worker->moveToThread(&workerThread1);
connect(&workerThread1, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &MainWindow::operate, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &MainWindow::handleResults);
workerThread1.start();
//子线程2
Worker *worker2 = new Worker;
worker2->moveToThread(&workerThread2);
connect(&workerThread2, &QThread::finished, worker2, &QObject::deleteLater);
connect(this, &MainWindow::operate2, worker2, &Worker::doWork2);//关联主线程与子线程的信号和槽
connect(worker2, &Worker::resultReady2, this, &MainWindow::handleResults2);//关联子线程与主线程的信号和槽
workerThread2.start();
}
MainWindow::~MainWindow()
{
delete ui;
workerThread1.quit();
workerThread1.wait();
workerThread2.quit();
workerThread2.wait();
}
void MainWindow::handleResults(const QString &str)
{
ui->lineEdit->setText(str);
qDebug()<<"MainWindow::handleResults收到的内容是:"<<str<<endl;
}
void MainWindow::handleResults2(const QString &str)
{
ui->lineEdit_2->setText(str);
qDebug()<<"MainWindow::handleResults2收到的内容是:"<<str<<endl;
}
void Worker::doWork(const QString &str) {
qDebug()<<"收到的内容是:"<<str<<endl;
emit resultReady(str);//在子线程中发射信号,驱动主线程的槽函数
}
void Worker::doWork2(const QString &str) {
qDebug()<<"收到的内容是:"<<str<<endl;
emit resultReady2(str);//在子线程中发射信号,驱动主线程的槽函数
}
void MainWindow::on_pushButton_clicked()
{
emit operate(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")+"进程1发射了信号!");//在主线程中发射信号,驱动子线程的槽函数,在子线程中做大量逻辑处理
emit operate2(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")+"进程2发射了信号!");//在主线程中发射信号,驱动子线程的槽函数,在子线程中做大量逻辑处理
}
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>
#include <QObject>
#include <QThread>
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork(const QString &str);
void doWork2(const QString &str);
signals:
void resultReady(const QString &result);
void resultReady2(const QString &result);
};
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
QThread workerThread1;
QThread workerThread2;
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
void handleResults(const QString &str);
void handleResults2(const QString &str);
signals:
void operate(const QString &str);
void operate2(const QString &str);
private:
Ui::MainWindow *ui;
};
#endif
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
秋风写于淄博,业务联系与技术交流:Q375172665
最后
以上就是满意钢笔为你收集整理的Qt中使用多线程并返回结果到主线程的例子的全部内容,希望文章能够帮你解决Qt中使用多线程并返回结果到主线程的例子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复