QT多线程之QtConcurrent::run()

news/2024/7/7 21:47:10

QtConcurren导读

QtConcurrent提供了编写多线程程序的高级api,也即不使用低级线程原语,而其他实现多线程的方式,例如子类化QThread、QObject::moveToThread()、子类化QRunnable对于共享数据的保护都要使用低级线程原语,这无疑是要非常小心的。
此外,根据Qt文档的描述:Programs written with QtConcurrent automatically adjust the number of threads used according to the number of processor cores available. This means that applications written today will continue to scale when deployed on multi-core systems in the future.,也就是说QtConcurrent可以根据机器的cpu自动调整线程数,以至于部署在其他机器上不用担心这方面的问题。
注:低级线程原语指的是:mutexes(互斥锁), read-write locks(读写锁), wait conditions(等待条件), or semaphores(信号量)

.pro 工程文件

使用 QtConcurrent 模块,需要在 .pro 中添加: QT += concurrent

QT += concurrent widgets
CONFIG += console
 
SOURCES += main.cpp 

QT多线程之QtConcurrent::run()

//在新的线程中调用普通函数 
template <typename T> QFuture<T> QtConcurrent::run(Function function, ...) 
//使用线程池中的线程调用普通函数 
template <typename T> QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ...) 
//在新的线程里调用成员函数 有多个重载实现不同的参数个数 
template <typename T> QFuture<T> QtConcurrent::run(className *obejct, Function function, ...)

这些模板都有多个重载,支持带参数函数,切可以带多个参数。
QFuture 也是一个模板类,它可以监控线程的运行状态有,并可以获取在另一个线程中运行的函数的返回值,返回值通过调用result()函数获取。
需要注意的是获取返回值之前,最好先调用waitForFinished()保证线程执行完毕。

示例

#pragma once
#include <QtCore/QObject>
#include <QtConcurrent/QtConcurrent>
#include <QtCore/QThread>
class ThreadTest {
public:
    ThreadTest();
    ~ThreadTest() = default;

public:
    void anotherThread();
    std::string anotherThreadReturn();
};

.cpp

#include "QtThreadTest.h"
#include <iostream>
#include <QFuture>
void normalFunction() {
    std::cerr << "Normal function thread ID: " << QThread::currentThreadId() << std::endl;
}
ThreadTest::ThreadTest()
{
    std::cerr << "main thread ID: " << QThread::currentThreadId() << std::endl;
    QtConcurrent::run(normalFunction);
    QFuture<void> future = QtConcurrent::run(this, &ThreadTest::anotherThread);
    QFuture<std::string> future1 = QtConcurrent::run(this, &ThreadTest::anotherThreadReturn);
    future.waitForFinished();
    future1.waitForFinished();
    std::cerr << "anotherThreadReturn result: " << future1.result() << std::endl;
}
void ThreadTest::anotherThread()
{
    std::cerr << "Another thread ID: " << QThread::currentThreadId() << std::endl;
}
std::string ThreadTest::anotherThreadReturn()
{
    std::cerr << "Another return thread ID: " << QThread::currentThreadId() << std::endl;
    return "This is result";
}

总结

  1. 调用run()
    之后,函数不一定会被立即执行,如果有多个run()被调用,函数的调用顺序不一定是run()的调用顺序,这些都和线程的调度有关系。
  2. run(function) 实际上等价于run(QThreadPool::globalInstance(),function)
    如果只是简单的想在其他线程中调用某个函数,不需要复杂的数据同步,那么QtConcurrent::run()
    相比其他实现多线程的方式绝对是不二之选。

http://lihuaxi.xjx100.cn/news/1289237.html

相关文章

(0day通用)中庆纳博某系统敏感信息泄露+未授权修改密码

申明&#xff1a;本次测试只作为学习用处&#xff0c;请勿未授权进行渗透测试&#xff0c;切勿用于其它用途&#xff01; 1.漏洞背景 北京中庆纳博信息技术有限公司&#xff0c;简称中庆纳博&#xff0c;是有20年历史的中庆集团旗下核心企业&#xff0c;专注于教育信息化的深度…

通过shell的while read line对一个文件中的考试分数进行人员分组

通过shell的while read line对一个文件中的考试分数进行人员分组&#xff0c;并记录分数 [rootecs-18b3 ~]# cat split.sh #!/bin/bash while read line donameecho ${line}|awk {print $1}scoreecho ${line}|awk {print $2}if [ ${score} -gt 90 ];thenecho -e "${name…

linux:Docker 退出容器但不关闭当前容器

参考&#xff1a; Docker 退出容器但不关闭当前容器_docker 怎么把容器hold_leoe_的博客-CSDN博客

前后端交互时数据加密的目的是什么

对于新手在网页开发的时候&#xff0c;总会遇到对数据加密的误解&#xff0c;尤其是刚开始接触相关代码看了一些用例之后90%的人免不了会想过一个问题&#xff0c;就是前后端加解密是为了什么。 例如下面的代码 后端加密代码 import javax.crypto.Cipher; import javax.cryp…

代码随想录算法训练营第2天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

今日学习的文章链接&#xff0c;或者视频链接 第一章 数组part02 第一章 数组part02 自己看到题目的第一想法 看完代码随想录之后的想法 977: class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int left 0;int right nums.size…

chatgpt赋能python:Python迭代运算:概述、应用及效果分析

Python迭代运算&#xff1a;概述、应用及效果分析 在Python编程领域中&#xff0c;迭代运算是一项基础性操作。它不仅适用于循环遍历数据&#xff0c;还支持函数式编程中的高阶函数应用&#xff08;例如map、filter等&#xff09;。本文将从多个方面探讨Python迭代运算的应用和…

MIT 6.824: Go并发相关的协程问题

1 为什么当结构体很大时&#xff0c;倾向于使用pointer receiver ? 可以避免对结构体进行复制&#xff0c;从而提高性能和减少内存占用; 但是要注意使用pointer receiver时不要出现空指针异常&#xff0c;在方法中要对指针接受者进行判断 2 当结构体中含有sync.Mutex类型的成…

【Rust 基础篇】Rust 结构体详解

文章目录 引言一、结构体的定义二、结构体实例化1、声明式实例化2、可变实例化 三、结构体的方法四、结构体的关联函数五、结构体的特性1、元组结构体2、类单元结构体 六、结构体的注意事项1、字段的可见性2、结构体的大小3、模式匹配 总结 引言 在Rust中&#xff0c;结构体&a…