QT两种最简单的多线程创建方法和应用示例

电脑杂谈  发布时间:2020-06-11 06:10:31  来源:网络整理

qt 线程_qt多线程绘图_qt 线程传递参数

有两种方法可以实现QT多线程. 一种是继承QThread的多线程方法,另一种是使用QObject实现多线程. 传统的方法是继承QTreadqt多线程绘图,但是这种方法更容易出错qt多线程绘图,这是QT官方推荐的第二种方法. 这是创建这两种方法的最简单方法.

simplethreadone.h

#ifndef SIMPLETHREADONE_H
#define SIMPLETHREADONE_H
#include <QThread>
class SimpleThreadOne : public QThread
{
public:
    SimpleThreadOne();
};
#endif // SIMPLETHREADONE_H

simplethreadone.cpp

#include "simplethreadone.h"
#include <QDebug>
SimpleThreadOne::SimpleThreadOne()
{
}

qt 线程_qt多线程绘图_qt 线程传递参数

simplethreadone.h

#ifndef SIMPLETHREADONE_H
#define SIMPLETHREADONE_H
#include <QThread>
class SimpleThreadOne : public QThread
{
public:
    SimpleThreadOne();
    void run();
};
#endif // SIMPLETHREADONE_H

simplethreadone.cpp

#include "simplethreadone.h"
#include <QDebug>
SimpleThreadOne::SimpleThreadOne()
{
}
void SimpleThreadOne::run()
{
    while (true)
    {
        qDebug()<<"SimpleThreadOne run!";
        sleep(2);
    }
}

#include "mainwindow.h"
#include <QApplication>
#include "simplethreadone.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    SimpleThreadOne *SThread = new SimpleThreadOne();
    SThread->start();
    return a.exec();
}

qt 线程传递参数_qt多线程绘图_qt 线程

simplethreadtwo.h

#ifndef SIMPLETHREADTWO_H
#define SIMPLETHREADTWO_H
#include <QObject>
class SimpleThreadTwo : public QObject
{
    Q_OBJECT
public:
    explicit SimpleThreadTwo(QObject *parent = nullptr);
public slots:
    void doSomething();
};
#endif // SIMPLETHREADTWO_H

simplethreadtwo.cpp

#include "simplethreadtwo.h"
#include <QDebug>
#include <unistd.h>
SimpleThreadTwo::SimpleThreadTwo(QObject *parent) : QObject(parent)
{
}
void SimpleThreadTwo::doSomething()
{
    while (true)
    {
        qDebug()<<"SimpleThreadTwo run!";
        sleep(2);
    }
}

doSomething是一个插槽功能,通过信号调用插槽功能以启动循环功能. 该信号由主线程发送.

qt 线程_qt多线程绘图_qt 线程传递参数

我的QT中的主线程是mainwindow. mainwindow.h代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "simplethreadtwo.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void SendStart(void);
signals:
    void Signal1();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

主线程通过SendStart函数发送自定义信号Signal1,该信号触发SimpleThreadTwo线程的循环函数.

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /**thread two**/
    QThread* m_objThread;
    SimpleThreadTwo* m_ThreadTwo;
    m_objThread= new QThread();
    m_ThreadTwo = new SimpleThreadTwo();
    m_ThreadTwo->moveToThread(m_objThread);
    connect(m_objThread,&QThread::finished,m_objThread,&QObject::deleteLater);
    connect(this,&MainWindow::Signal1,m_ThreadTwo,&SimpleThreadTwo::doSomething);
    m_objThread->start();
    /**start**/
    SendStart();
}
void MainWindow::SendStart()
{
    emit Signal1();
}
MainWindow::~MainWindow()
{
    delete ui;
}

qt 线程_qt多线程绘图_qt 线程传递参数

运行效果如下:

从上图中可以看到,以两种方式创建的线程都可以正常运行.

项目代码下载路径: QT两种最简单的多线程创建方法和应用示例

以上两种方法是创建线程的更主流方法,但是以上代码只是创建了一个线程. 没有正常的线程退出和线程安全问题. 更详细的线程操作可以参考其他资料:

使用多线程1的Qt的一些经验. 继承QThread的多线程方法

使用多线程2的Qt的一些经验. 继承QObject的多线程方法

QT开发(34)-QT多线程编程


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-241472-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...