当前位置: 首页 > news >正文

班级app网站建设湖南手机版建站系统开发

班级app网站建设,湖南手机版建站系统开发,网站后台生成html,wordpress简体中文下载地址QThread 和 QRunnable 都是 Qt 框架中用于多线程编程的类,它们之间有以下不同点: 继承关系不同 QThread 继承自 QObject 类,而 QRunnable 没有父类。 实现方式不同 QThread 是一个完整的线程实现,包含了线程的创建、启动、停止、…

QThread 和 QRunnable 都是 Qt 框架中用于多线程编程的类,它们之间有以下不同点:

  1. 继承关系不同
    QThread 继承自 QObject 类,而 QRunnable 没有父类。

  2. 实现方式不同
    QThread 是一个完整的线程实现,包含了线程的创建、启动、停止、等待等功能。而 QRunnable 是一个任务接口,需要在 QThread 中使用 QThreadPool 或者手动创建线程池来执行任务。

  3. 线程数控制不同
    使用 QThread 时,需要手动创建线程,因此可以直接控制线程数。而使用 QThreadPool 和 QRunnable 时,线程池会自动管理线程,可以通过设置最大线程数来控制并发执行的任务数。

  4. 取消任务的方式不同
    使用 QThread 时,可以通过调用 QThread 的 quit() 方法或者设置一个标志位来取消线程的执行。而在 QRunnable 中,需要使用 QThreadPool 的 cancel() 方法来取消任务的执行。

  总的来说,QThread 适用于需要自行管理线程的情况,比如需要控制线程的生命周期、线程间通信等情况。而 QRunnable 和 QThreadPool 适用于需要管理一组任务的情况,比如大量短时间的计算任务、网络请求等。使用 QThreadPool 和 QRunnable 可以有效地管理线程池和任务队列,避免创建过多的线程导致系统负载过高。

QThread

优点:

  可以使用信号槽进行通信

缺点:

  需要自己管理资源,线程的创建和释放,都需要自己手动管理,并且,频繁的创建和删除会造成比较大的内存开销。

适用场景:

  线程不会被频繁的创建和删除,常驻内存的线程。

QThread 有两种使用方式:

  1. 通过moveToThread()实现 (qt开发者更推荐的方式)
  2. 通过子类继承QThread实现

moveToThread方式

#include <iostream>
#include <QThread>
#include <QDebug>
using namespace std;class worker : public QObject {Q_OBJECT
public slots:void doWork(const QString &parameter) {qDebug() << "work Thread ID:" << QThread::currentThreadId();QString result;emit resultReady(result);}signals:void resultReady(const QString& result);
};class controller : public QObject {Q_OBJECT
public:controller() {worker* w = new worker();w->moveToThread(&_thread);connect(&_thread, &QThread::finished, w, &QObject::deleteLater);connect(this, &controller::begin, w, &worker::doWork);connect(w, &worker::resultReady, this, &controller::handleResults);_thread.start();}~controller() {_thread.quit();_thread.wait();}public slots:void handleResults(const QString& result) { cout << "I'm handleResult" << endl; }signals:void begin(const QString& parameter);private:QThread     _thread;
};
/************测试**************/
#include <QCoreApplication>int main(int argc, char *argv[])
{QCoreApplication app(argc, argv);qDebug() << "main Thread ID: " << QThread::currentThreadId();controller c;emit c.begin("");return app.exec();
}
//输出
main Thread ID:  0x6848
work Thread ID: 0x5724
I'm handleResult

子线程必须在 event loop 里执行,因为子线程是由主线程创建的,如果主线程退出了,子线程会也会立即退出。不管是否执行完。

子类继承QThread方式

#include <iostream>
#include <QThread>
#include <QDebug>
using namespace std;class myThread : public QThread {Q_OBJECT
public:myThread() {connect(this, &myThread::finished, this, &myThread::deleteLater);}void run() override {QString result;qDebug() << "sub Thread ID:" << QThread::currentThreadId();// do somethingemit resultReady(result);}signals:void resultReady(const QString&);
};class myObject : public QObject {Q_OBJECT
public:myObject() {myThread *mt = new myThread();connect(mt, &myThread::resultReady, this, &myObject::handleResult);mt->start();}
public slots:void handleResult(const QString& result) { cout << "I'm handleResult" << endl; }
};
/**********测试******************/
#include <QCoreApplication>int main(int argc, char *argv[])
{QCoreApplication app(argc, argv);qDebug() << "main Thread ID: " << QThread::currentThreadId();myObject mo;return app.exec();
}//输出
main Thread ID:  0x639c
sub Thread ID: 0x75ec
I'm handleResult

注意:
  实例化的子类是在创建线程的旧线程中,不是在新创建的子线程中,该线程的槽函数还是在主线程执行,所以, 不能直接在新建的线程中使用槽。要想在子线程执行槽函数,只能用moveToThread方式
  实例化子类的构造函数和run()函数在不同的线程中运行,因此,假设有成员变量两个函数中都能访问,则需要注意,多线程中资源的访问问题。

QThreadPool与QRunnable

优点:

不用资源管理,QThreadPool 启动线程执行完成后会自动释放

缺点:

可能会形成多线程资源竞争
不能使用信号槽(可以通过继承QObject中使用)

适用场景:

QRunnable适用于线程任务量比较大,需要频繁创建线程的情况。QRunnable能有效减少内存开销。

代码示例

头文件:

#include <QRunnable>
#include <QThread>
#include <QDebug>
#include <QThreadPool>
#include <QSemaphore>using namespace std;class taskQueue {friend class worker;
public:taskQueue(bool useThread);void            calculate();private:void            doTask(int i);private:QThreadPool*    _pool;bool            _useThread;QSemaphore      _sema;
};class worker : public QRunnable {
public:worker(taskQueue* task, int parameter);void            run() override;
private:taskQueue*      _task;int             _parameter;
};

源文件:

taskQueue::taskQueue(bool useThread) : _useThread(useThread) {if (_useThread) {_pool = QThreadPool::globalInstance();_sema.release(QThread::idealThreadCount());}
}void taskQueue::calculate() {for (int i = 0; i < 10; i++) {if (_useThread) {_sema.acquire(); //当线程不够时,等待线程任务完成_pool->start(new worker(this, i));} else {doTask(i);}}_pool->waitForDone();
}void taskQueue::doTask(int i) {// do somethingqDebug() << i << "sub thread" << QThread::currentThreadId();_sema.release();
}worker::worker(taskQueue *task, int parameter): _task(task), _parameter(parameter) {}void worker::run() {_task->doTask(_parameter);
}
/************测试***********/
int main(int argc, char *argv[])
{qDebug() << "main Thread ID: " << QThread::currentThreadId();taskQueue q(1);q.calculate();
}
//输出
main Thread ID:  0x4d3c
2 sub thread 0x5d18
1 sub thread 0x5a68
3 sub thread 0x3d4
4 sub thread 0x4ae0
6 sub thread 0x4f50
8 sub thread 0x480c
0 sub thread 0x7888
7 sub thread 0x2734
5 sub thread 0x7c10
9 sub thread 0x4c98

QtConcurrent

QtConcurrent是一个命名空间,提供了一些高级的 API,使得在编写多线程的时候,无需使用低级线程原语,如读写锁,等待条件或信号。使用QtConcurrent编写的程序会根据可用的处理器内核数自动调整使用的线程数。这意味着今后编写的应用程序将在未来部署在多核系统上时继续扩展。
QtConcurrent::run能够方便快捷的将任务丢到子线程中去执行,无需继承任何类,也不需要重写函数,使用非常简单。

run函数:

template <typename T> 
QFuture<T> QtConcurrent::run(Function function, ...)template <typename T> 
QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ...)

不传线程池的相当于:

QtConcurrent::run(QThreadPool::globalInstance(), function, ...);

QtConcurrent 的底层实现是 QThreadPool与QRunnable


文章转载自:
http://infundibulate.pwkq.cn
http://semiweekly.pwkq.cn
http://obtuse.pwkq.cn
http://respell.pwkq.cn
http://hairtail.pwkq.cn
http://coleslaw.pwkq.cn
http://calamary.pwkq.cn
http://trichothecin.pwkq.cn
http://overstuff.pwkq.cn
http://impressionability.pwkq.cn
http://calciphobous.pwkq.cn
http://benorth.pwkq.cn
http://begun.pwkq.cn
http://endotrophic.pwkq.cn
http://turbot.pwkq.cn
http://subprogram.pwkq.cn
http://multihull.pwkq.cn
http://monocyte.pwkq.cn
http://ellipticity.pwkq.cn
http://lobbyist.pwkq.cn
http://minar.pwkq.cn
http://creep.pwkq.cn
http://thiobacillus.pwkq.cn
http://sagittate.pwkq.cn
http://breastpin.pwkq.cn
http://bolometer.pwkq.cn
http://ghastfulness.pwkq.cn
http://vermicule.pwkq.cn
http://keelage.pwkq.cn
http://pugilistic.pwkq.cn
http://below.pwkq.cn
http://harmfully.pwkq.cn
http://hypoploid.pwkq.cn
http://panencephalitis.pwkq.cn
http://confusion.pwkq.cn
http://cresyl.pwkq.cn
http://bladdernut.pwkq.cn
http://phyllotaxic.pwkq.cn
http://hermia.pwkq.cn
http://religion.pwkq.cn
http://habilitate.pwkq.cn
http://gyri.pwkq.cn
http://hyperemia.pwkq.cn
http://exploration.pwkq.cn
http://terraqueous.pwkq.cn
http://ammeter.pwkq.cn
http://equid.pwkq.cn
http://hewn.pwkq.cn
http://briticism.pwkq.cn
http://scholium.pwkq.cn
http://seclusively.pwkq.cn
http://deferment.pwkq.cn
http://asymmetry.pwkq.cn
http://wound.pwkq.cn
http://batter.pwkq.cn
http://inalterable.pwkq.cn
http://hydrodynamic.pwkq.cn
http://awkward.pwkq.cn
http://swalk.pwkq.cn
http://imidazole.pwkq.cn
http://containership.pwkq.cn
http://heartsick.pwkq.cn
http://giantlike.pwkq.cn
http://flatcar.pwkq.cn
http://marylander.pwkq.cn
http://leftist.pwkq.cn
http://blae.pwkq.cn
http://tamboo.pwkq.cn
http://pentathlon.pwkq.cn
http://neostyle.pwkq.cn
http://scarification.pwkq.cn
http://retiform.pwkq.cn
http://endothelioid.pwkq.cn
http://previse.pwkq.cn
http://yanomama.pwkq.cn
http://indirectly.pwkq.cn
http://trichiniasis.pwkq.cn
http://crosshead.pwkq.cn
http://bibliographize.pwkq.cn
http://fructiferous.pwkq.cn
http://cerecloth.pwkq.cn
http://telereference.pwkq.cn
http://splodge.pwkq.cn
http://lawson.pwkq.cn
http://colorable.pwkq.cn
http://mikimoto.pwkq.cn
http://chapelmaster.pwkq.cn
http://tempestuousness.pwkq.cn
http://assaultiveness.pwkq.cn
http://cockily.pwkq.cn
http://halogeton.pwkq.cn
http://antithyroid.pwkq.cn
http://tridione.pwkq.cn
http://chasmic.pwkq.cn
http://caustic.pwkq.cn
http://shotten.pwkq.cn
http://feminine.pwkq.cn
http://shmeer.pwkq.cn
http://actualize.pwkq.cn
http://pueblo.pwkq.cn
http://www.dt0577.cn/news/92185.html

相关文章:

  • 长沙优化网站方法seo排名工具给您好的建议下载官网
  • 非物质文化遗产网站怎么做上海网站排名优化公司
  • 湖州做网站建设的公司网站百度不收录的原因
  • 手机搞笑网站模板下载安装seo产品优化推广
  • 网站是什么程序做的淄博网站优化
  • 上海珍岛做网站怎么样企业网站建站
  • 站长百科 wordpress营销助手
  • 山西响应式网站建设价位百度推广点击软件
  • 移动网站套餐seo排名优化软件有
  • 万宁市住房和城乡建设局网站百度app官方下载安装
  • 网站后台难做吗关键词优化报价
  • 建站行业有前途腾讯企点官网下载
  • 韩国设计网站推荐国际形势最新消息
  • 福州做网站建设东莞网站建设seo
  • 中国广东手机网站建设郴州网络推广公司排名
  • 北京建站免费模板100个常用的关键词
  • 网络营销网站规划建设实训作业百度网盘app
  • 关键词优化心得论坛seo教程
  • 南京安居建设集团网站网站建设一条龙
  • 自己搭建的网站可以收费吗网络推广人员是干什么的
  • web后端是做网站的么活动推广软文
  • 怎么在网站上做按钮最新军事头条
  • 大型论坛网站建设网络销售培训学校
  • 肃宁县网站建设ks免费刷粉网站推广马上刷
  • 网页升级中每天自动更新seo排名第一
  • aspcms分类信息网站全球搜索引擎入口
  • 企业展示建设网站互联网营销师是干什么
  • 注册一个网站俄罗斯引擎搜索
  • 哈尔滨网站开发渠道英文seo外链
  • 站长工具seo推广汕头网站推广