千家信息网

Qt5.9如何实现简单的多线程

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,本篇文章给大家分享的是有关Qt5.9如何实现简单的多线程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Qt开启多线程,主要用到类QThr
千家信息网最后更新 2024年11月27日Qt5.9如何实现简单的多线程

本篇文章给大家分享的是有关Qt5.9如何实现简单的多线程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Qt开启多线程,主要用到类QThread。有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run()。当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程。第二种方法是继承一个QObject类,然后利用moveToThread()函数开启一个线程槽函数,将要花费大量时间计算的代码放入该线程槽函数中。第二种方法可以参考我写的另一篇博客:https://www.yisu.com/article/223796.htm

下面我总结的主要是第一种方法。(注意:只有在run()函数里面才是新的线程,所有复杂逻辑都应该在run()函数里面做。当run()函数运行完毕后,该线程生命周期结束。)

创建多线程步骤如下:

a1新建一个类MyThread,基类为QThread。

a2重写类MyThread的虚函数void run();,即新建一个函数protected void run(),然后对其进行定义。

a3在需要用到多线程的地方,实例MyThread,然后调用函数MyThread::start()后,则开启一条线程,自动运行函数run()。

a4当停止线程时,调用MyThread::wait()函数,等待线程结束,并且回收线程资源。

1.1新建一个widget工程,不要勾选ui界面。然后分别在mythread.h,mythread.cpp,widget.h,widget.cpp,main.cpp分别添加如下代码。

mythread.h

#ifndef MYTHREAD_H#define MYTHREAD_H #include  class MyThread : public QThread{public:    MyThread();    void closeThread(); protected:    virtual void run(); private:    volatile bool isStop;       //isStop是易失性变量,需要用volatile进行申明}; #endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"#include #include  MyThread::MyThread(){    isStop = false;} void MyThread::closeThread(){    isStop = true;} void MyThread::run(){    while (1)    {        if(isStop)            return;        qDebug()<

widget.h

#ifndef WIDGET_H#define WIDGET_H #include #include #include #include #include  class Widget : public QWidget{    Q_OBJECT public:    Widget(QWidget *parent = 0);    ~Widget();    void createView(); private slots:    void openThreadBtnSlot();    void closeThreadBtnSlot();    void finishedThreadBtnSlot();//    void testBtnSlot(); private:    QVBoxLayout *mainLayout;        MyThread *thread1;}; #endif // WIDGET_H

widget.cpp

#include "widget.h"#include #include  Widget::Widget(QWidget *parent)    : QWidget(parent){    createView();} void Widget::createView(){    /*添加界面*/        QPushButton *openThreadBtn = new QPushButton(tr("打开线程"));    QPushButton *closeThreadBtn = new QPushButton(tr("关闭线程"));    mainLayout = new QVBoxLayout(this);    mainLayout->addWidget(openThreadBtn);    mainLayout->addWidget(closeThreadBtn);    mainLayout->addStretch();    connect(openThreadBtn,SIGNAL(clicked(bool)),this,SLOT(openThreadBtnSlot()));    connect(closeThreadBtn,SIGNAL(clicked(bool)),this,SLOT(closeThreadBtnSlot()));         /*线程初始化*/    thread1 = new MyThread;    connect(thread1,SIGNAL(finished()),this,SLOT(finishedThreadBtnSlot()));} void Widget::openThreadBtnSlot(){    /*开启一个线程*/        thread1->start();    qDebug()<<"主线程id:"<closeThread();    thread1->wait();} void Widget::finishedThreadBtnSlot(){    qDebug()<

main.cpp

#include "widget.h"#include  int main(int argc, char *argv[]){    QApplication a(argc, argv);    Widget w;    w.resize(960,640);    w.show();     return a.exec();}

1.2程序构建和运行后,结果如下图所示:

以上就是Qt5.9如何实现简单的多线程,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0