易语言 做网站,河南中国建设银行官网站,电商网络推广培训,浏览器大全网址上文列举了qt中线程的几种方法#xff0c;其中2种方法最为常见。 这两种方法都少不了QThread类#xff0c;前者继承于QThread类#xff0c;后者复合QThread类。
本文以实例的方式描述了movetothread#xff08;#xff09;这种线程的方法#xff0c;将QObject的子类移动…上文列举了qt中线程的几种方法其中2种方法最为常见。 这两种方法都少不了QThread类前者继承于QThread类后者复合QThread类。
本文以实例的方式描述了movetothread这种线程的方法将QObject的子类移动到指定的线程。
一、例子
1. Worker类
1.1Worker类头文件
#ifndef WORKER_H #define WORKER_H #include QObject #includeQDebug#include QThread class Worker : public QObject { Q_OBJECT public: explicit Worker(QObject *parent nullptr); public slots: void doWork(const QString parameter); signals: void resultReady(const QString result); }; #endif // WORKER_H1.2 Worker类cpp文件
#include worker.h Worker::Worker(QObject *parent) : QObject{parent} {}void Worker::doWork(const QString parameter) { // 在这里写入你的线程代码 qDebug() Thread2 is running; qDebug() parameter;//收到的参数 //一个简单的循环 for (int i 0; i 5; i) { QThread::msleep(500); ; // 休眠1秒 qDebug() !!!; } qDebug() end2; emit resultReady();//发结果 }
2.Controller类
2.1Controller类头文件
#ifndef CONTROLLER_H #define CONTROLLER_H #include QObject #include worker.h#include QThread class Controller : public QObject { Q_OBJECT public: explicit Controller(QObject *parent nullptr); QThread workerThread;//复合了QThread类 signals: void operate(const QString parameter); public slots: void handleResult(const QString str); };
#endif // CONTROLLER_H
2.2Controller类cpp文件
#include controller.h Controller::Controller(QObject *parent) : QObject{parent} { Worker *worker new Worker; worker-moveToThread(workerThread); connect(this, Controller::operate, worker, Worker::doWork); connect(worker, Worker::resultReady, this,Controller::handleResult); connect(workerThread, QThread::finished, worker, QObject::deleteLater); workerThread.start(); } void Controller::handleResult(const QString str) { qDebug()str;//取结果 }
3.在窗口类的按钮函数里放入
void MainWindow::on_pushButton_xxx_clicked()//你自己的按钮函数 { Controller *controller new Controller(); controller-operate(parameter); }
二、优缺点
优点克服了重写run的缺点比较灵活简洁
缺点但是不能在线程里面实现常驻任务(死循环的任务)。
轻量级的函数可以用movethread无需创建独立线程类例如你有多个小函数要在线程内做, 全部扔给一个QThread。还有一开始没使用线程但是后边发觉这些代码还是放线程比较好如果用子类化QThread的方法重新设计代码将会有可能让你把这一段推到重来这个时候moveThread的好处就来了你可以把这段代码的从属着movetothread把代码移到槽函数用信号触发它就行了。