龙空技术网

Qt多线程的三种方法QtConcurrent::run()+QThreadPool

QT教程 226

前言:

此时姐妹们对“qt数据库连接池”大概比较关切,小伙伴们都想要分析一些“qt数据库连接池”的相关资讯。那么小编在网络上网罗了一些对于“qt数据库连接池””的相关知识,希望你们能喜欢,我们快快来学习一下吧!

一、简介

QtConcurrent这是一个高级 API,构建于QThreadPool之上,它提供更高层次的函数接口(APIs),使所写的程序,可根据计算机的CPU核数,自动调整运行的线程数量。通常用于处理大多数通用的并行计算模式。

注意,QtConcurrent是一个命名空间而不是一个类,因此其中的所有函数都是命名空间内的全局函数。

二、使用方法

1. 添加concurrent

从Qt4.4之后,QtConcurrent从core模块中独立出来,作为单独的模块。

所以先要在.pro中添加 QT += concurrent

QT += core gui concurrent

2. 使用方法

可以分别将外部函数,lambda表达式,成员函数运行在某一个线程中。

调用外部函数

调用Lambda表达式(同外部函数)

调用成员函数

调用常量成员函数

代码如下:

//1.调用外部函数func1,并得到返回值QFuture<QString> f1 =QtConcurrent::run(func1,QString("aa"));f1.waitForFinished();qDebug()<<f1.result();//2.调用Lambda函数,实际同外部函数方式QThreadPool pool;QFuture < void > future = QtConcurrent::run([=](){qDebug() << __FUNCTION__ << QThread::currentThreadId() << QThread::currentThread();});QFuture < void > future2 = QtConcurrent::run([=](){qDebug() << __FUNCTION__ << QThread::currentThreadId() << QThread::currentThread();});//3.调用成员函数QFuture<void> future3 = QtConcurrent::run(this, &Dialog::memberFun1);//4.常量成员函数QByteArray::split()QByteArray bytearray = "hello,world";QFuture<QList<QByteArray>> future4 = QtConcurrent::run(bytearray, &QByteArray::split, ',');QList<QByteArray> result = future4.result();qDebug()<<"result:"<<result;

运行如下:

func1 "aa" 0xacc QThreadPoolThread(0x3d421d0, name = "Thread (pooled)")"func1 return"operator() 0xacc QThreadPoolThread(0x3d421d0, name = "Thread (pooled)")operator() 0x70ac QThreadPoolThread(0x3d42090, name = "Thread (pooled)")memberFun1 0x8a88 QThreadPoolThread(0x3d421b0, name = "Thread (pooled)")result: ("hello", "world")
三、Qt多线程三种方法总结

四、不同开发场景下的考虑

需要线程的生命周期

开发场景

解决方案

单次调用

在其他的线程中运行一个方法,当方法运行结束后退出线程。

1)编写一个函数,然后利用 QtConcurrent::run()运行它;(2)从QRunnable 派生一个类,并利用全局线程池QThreadPool::globalInstance()->start()来运行它。(3) 从QThread派生一个类, 重载QThread::run() 方法并使用QThread::start()来运行它。

单次调用

一个耗时的操作必须放到另一个线程中运行。在这期间,状态信息必须发送到GUI线程中。

使用 QThread,,重载run方法并根据情况发送信号。.使用queued信号/槽连接来连接信号与GUI线程的槽。

常驻

有一对象位于另一个线程中,将让其根据不同的请求执行不同的操作。

这意味与工作者线程之间的通信是必须的。 从QObject 派生一个类并实现必要的槽和信号,将对象移到一个具有事件循环的线程中,并通过queued信号/槽连接与对象进行通信。

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」

标签: #qt数据库连接池