QT 继承 Qobject实现多线程

Qt实现多线程的方法有很多种,不过通过继承Qobject这一种方法可以使用信号与槽函数与线程间进行通讯:

一,创建自己的继承Qobject的线程类

connect_thread.h:

#ifndef CONNECT_THREAD_H
#define CONNECT_THREAD_H

#include <QObject>
#include <QThread>
class connect_thread :  public QObject
{
    Q_OBJECT
public:
    explicit connect_thread(QObject *parent = 0);
    void closeThread();
signals:

protected:

public slots:
     //开启线程的槽函数
     void startThreadSlot();
private:
     bool isStop;
};

#endif // CONNECT_THREAD_H

connect_thread.cpp:

#include "connect_thread.h"
#include <iostream>
#include <QUdpSocket>
#include <QDebug>
using namespace std;
connect_thread::connect_thread(QObject *parent)
    :QObject(parent)
{
}
void connect_thread::closeThread()
{
    isStop = true;
}
//这个函数写要循环运行的代码段
void connect_thread::startThreadSlot()
{
    isStop = false;
    while (1)
    {
        if(isStop)
            return;
        qDebug()<<"MyThread::startThreadSlot QThread::currentThreadId()=="<<QThread::currentThreadId();
        QThread::sleep(1);
    `在这里插入代码片`}

}

主函数;

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "connect_thread.h"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    connect_thread *th;

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
     QThread *server_th = new QThread();  //xianchengrongqi
     th = new connect_thread;
     th->moveToThread(server_th);  //zhuanyi
     connect(server_th,SIGNAL(started()),th,SLOT(startThreadSlot()));  //开启线程槽函数
     server_th->start();                                                           //开启多线程槽函数
     qDebug()<<"mainWidget QThread::currentThreadId()=="<<QThread::currentThreadId();

}

其中: 先使用QThread创建一个多线程容器:QThread *server_th = new QThread();
然后再新建自己的类: th = new connect_thread;
将自己的类移动到线程容器内: th->moveToThread(server_th);
连接QThread的开启线程信号,当线程开启时运行自己写的代码段: connect(server_th,SIGNAL(started()),th,SLOT(startThreadSlot())); //开启线程槽函数
开启线程:server_th->start(); //开启多线程槽函数

QThread *server_th = new QThread();  //xianchengrongqi
     th = new connect_thread;
     th->moveToThread(server_th);  //zhuanyi
     connect(server_th,SIGNAL(started()),th,SLOT(startThreadSlot()));  //开启线程槽函数
     server_th->start();                                                           //开启多线程槽函数
     qDebug()<<"mainWidget QThread::currentThreadId()=="<<QThread::currentThreadId(); #打印主线程号

猜你喜欢

转载自blog.csdn.net/qq_38441692/article/details/89638944