Qt 多线程使用moveToThread
2023-09-14 09:12:37 时间
Qt有两种多线程的方法,其中一种是继承QThread的run函数,
另外一种是把一个继承于QObject的类用moveToThread函数转移到一个Thread里。
Qt4.8之前都是使用继承QThread的run这种方法,但是Qt4.8之后,Qt官方建议使用第二种方法。
具体的使用步骤如下:
1.从QObject派生一个类,将耗时的工作写在该类的槽函数中。
2.将派生类对象移动到一个QThread中,该线程需要start。(这一步使用moveToThread)
3.通过信号连接派生类的槽函数,并通过信号触发槽函数。(槽函数在子线程中执行)
//tes.h #ifndef TES_H #define TES_H #include <QCoreApplication> #include <QDebug> #include <QThread> #include <QString> #include <QObject> class Worker:public QObject { Q_OBJECT public: explicit Worker(QObject *parent=0); ~Worker(); signals: void sig_finish(); public slots: void slot_dowork(); }; #endif // TES_H
//tes.cpp #include "tes.h" Worker::Worker(QObject *parent):QObject(parent) { qDebug()<<"worker()"; } Worker::~Worker() { qDebug()<<"~worker()"; } void Worker::slot_dowork() { qDebug()<< "do work,thread id = " << QThread::currentThreadId(); emit sig_finish(); }
//mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "tes.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void dowork(); private: Ui::MainWindow *ui; Worker *m_pworker; QThread *m_pthread; signals: void sig_dowork(); public slots: void slot_finish(); }; #endif // MAINWINDOW_H
//mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { qDebug()<<"mainwindow()"; ui->setupUi(this); m_pworker = new Worker(); m_pthread = new QThread(); m_pworker->moveToThread(m_pthread); qDebug()<< "start,thread id = " << QThread::currentThreadId(); connect(m_pthread, &QThread::finished, m_pworker, &QObject::deleteLater); connect(this,SIGNAL(sig_dowork()),m_pworker,SLOT(slot_dowork())); connect(m_pworker,SIGNAL(sig_finish()),this,SLOT(slot_finish())); } MainWindow::~MainWindow() { qDebug()<<"~mainwindow()"; delete ui; m_pthread->quit(); m_pthread->wait(); } void MainWindow::dowork() { m_pthread->start(); emit sig_dowork(); } void MainWindow::slot_finish() { qDebug()<< "finish,thread id = " << QThread::currentThreadId(); }
//main.cpp #include <QCoreApplication> #include <QDebug> #include <QThread> #include <QString> #include <QObject> #include <QApplication> #include "tes.h" #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); w.dowork(); return a.exec(); }
相关文章
- Qt-利用QUdpSocket实现UDP双网卡通信处理
- Qt-TabWidget控件使用方法
- QT-Qt界面居中显示
- QT-Qt中MediaPlay的使用,播放视频或MP4
- QT-Qt显示GIF图片
- Qt-char*与QString互转 floatToqstring char*与QString互转 qt字符串与字符串数组操作 Qt 的QString类的使用
- QT小滑块
- Qt编写的项目作品36-秘钥生成工具
- Qt编写项目作品27-多线程文件传输
- Qt开源作品15-视频监控画面
- Qt通用方法及类库1
- Qt系列文章030-QThread多线程
- Qt多线程实例
- Qt 关于QT_BEGIN_NAMESPACE宏的作用
- Qt多线程的使用
- qt操作json(QT 教程)
- Qt 多线程QThread实现方法之一
- Qt多线程即写即用QThread实现方法
- 【Qt】解决ubuntu中qt从一个工程去找另一个工程文件
- 9、QT基础——Qt消息机制和事件
- Qt之自定义QSlider
- QT使用tableWidget显示双排列表 并且选中用红框圈出来
- Qt中使用vlc-qt处理音视频
- Qt creator 编译错误 :cannot find file .pro qt
- Qt开发,Qt开发教程,Qt开发例程,Qt开源社区yafeilinux
- Qt Creator 快捷键
- Qt中的多线程编程