http://www.cnblogs.com/xinxue/p/6840315.html

本文以 Qt 中的 QtConcurrent::run() 函数为例,介绍如何将函数运行在单独的某一个线程中。

1  QtConcurrent::run()

QtConcurrent 是一个命名空间,它提供了高层次的函数接口 (APIs),使得编写的程序,可根据当前计算机中实际的 CPU 核数,自动调整运行的线程数目。

下面是 Qt 中的自带例程 runfunction,对应于安装目录为  D:\Qt\Qt5.8.0\Examples\Qt-5.8\qtconcurrent\runfucntion

1.1  .pro 工程文件

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

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

1.2  main.cpp

 1 #include <QApplication>
2 #include <QDebug>
3 #include <QThread>
4
5 #include <QString>
6 #include <QtConcurrent>
7
8 void func(QString name)
9 {
10 qDebug() << "Hello" << name << "from" << QThread::currentThread();
11 }
12
13 int main(int argc, char **argv)
14 {
15 QApplication app(argc, argv);
16
17 QFuture<void> fut1 = QtConcurrent::run(func, QString("Thread 1"));
18 QFuture<void> fut2 = QtConcurrent::run(func, QString("Thread 2"));
19
20 fut1.waitForFinished();
21 fut2.waitForFinished();
22 }

可以看到,使用 QtConcurrent::run() 函数,分别将  func() 运行在两个不同的线程之中,输出的结果如下:

Hello "Thread 2" from QThread(0x3597f0, name = "Thread (pooled)")
Hello "Thread 1" from QThread(0x337720, name = "Thread (pooled)")

下面是对使用 QtConcurrent::run() 的详细阐释,阅读完 2 和 3,再来看上面的 runfunction 例程,就非常容易理解了。

2  普通函数

2.1  将函数运行在某一个线程中

extern void func();
QFuture<void> future = QtConcurrent::run(func);

如果要为其指定线程池,可以将线程池的指针作为第一个参数传递进去

extern void func();
QThreadPool pool;
QFuture<void> future = QtConcurrent::run(&pool, func);

2.2  向该函数传递参数

需要传递的参数,需要跟在函数名之后,依次加入

extern void FuncWithArguments(int arg1, const QString &string);

 int integer = ...;
QString string = ...; QFuture<void> future = QtConcurrent::run(FuncWithArguments,integer,string);

2.3  获取该函数的计算结果

extern QString Func(const QByteArray &input);

QByteArray byte_array = ...;

QFuture<QString> future = QtConcurrent::run(func, byte_array);
...
QString result = future.result();

3  成员函数

要将类中的成员函数运行在某一个线程中,可将指向该类实例的 引用或指针 作为 QtConcurrent::run 的第一个参数传递进去,

常量成员函数一般传递 常量引用 (const reference),而非常量成员函数一般传递 指针 (pointer)

3.1  常量成员函数

在一个单独的线程中,调用 QByteArray 的常量成员函数 split(),传递给 run() 函数的参数是 bytearray

  QByteArray bytearray = "hello world";
QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
...
QList<QByteArray> result = future.result();

3.2  非常量成员函数

在一个单独的线程中,调用 QImage 的非常量成员函数 invertPixels(),传递给 run() 函数的参数是 &image

  QImage image = ...;
QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);
...
future.waitForFinished();
// At this point, the pixels in 'image' have been inverted

qt 创建线程的更多相关文章

  1. Qt QThread 线程创建,线程同步,线程通信 实例

    1.  继承QThread, 实现run()方法, 即可创建线程. 2. 实例1 代码 myThread.h #ifndef MYTHREAD_H #define MYTHREAD_H #includ ...

  2. QT 创建一个线程播放监控视频

    1.创建一个线程类(PlayVideoThread): PlayVideoThread.h头文件 #pragma once #include <QObject> #include &quo ...

  3. Qt之线程基础

    何为线程 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据计算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲.这是一个两个进程并行工作的例 ...

  4. Qt经典—线程、事件与Qobject(耳目一新)

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

  5. 界面编程之QT的线程20180731

    /*******************************************************************************************/ 一.为什么需 ...

  6. Qt经典—线程、事件与Qobject

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

  7. Qt 子线程更新Ui

    最近做练习,写一个Qt版的飞机大战,需要用子线程更新UI,发现Qt子线程不能更新Ui,否则程序会崩溃.在网上百度了下,说是需要在子线程自定义信号,然后在线程回调的run()函数里发射信号,主线程连接信 ...

  8. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  9. [笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...

随机推荐

  1. flask 的上下文管理

    Flask的上下文对象 Flask有两种Context(上下文),分别是 RequestContext 请求上下文 Request 请求的对象,封装了Http请求(environ)的内容 Sessio ...

  2. MBR为什么不支持3T硬盘

    MBR,全称为Master Boot Record,即硬盘的主引导记录.(是管理硬盘分区的一种模式.升级版是GPT) MBR保存在硬盘的第1个扇区(即硬盘的0柱面.0磁头.1扇区).它由三个部分组成, ...

  3. 使用navicat for mysql图形界面操作数据库、使用node.js操作数据库写接口

    1.先启动MYSQL服务 2.打开navicat for mysql, 点击链接,输入如下的内容: 3.新建数据表 4.数据库(新建一个db.js) //数据库链接配置 module.exports ...

  4. Q443 压缩字符串

    给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回数组的新长度. 进阶: ...

  5. ibatis配置文件中的XML解析错误The content of elements must consist of well-formed character data or markup.

    在检查过所有的标签名都没有问题的情况下. xml中的小于号属于非法字符. SQL语句中则可能需要小于号,此时就需要用<![CDATA[  ]]>将小于号包裹,如此不会被xml解析器解析. ...

  6. Yii2 hasMany 关联后加条件

    当前模型类为活动表id,关联评论表的type_id,条件是评论表的type要等于2public function getComment(){ return $this->hasMany(Comm ...

  7. 从零开始学Linux(11)--more

    more命令,是将文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空格键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还 ...

  8. stream4

    import java.util.Comparator; import java.util.function.BinaryOperator; public class BinaryOperatorTe ...

  9. poi读取excel2010

    package com.icss.test; import java.io.FileInputStream;import java.io.InputStream;import java.util.Ar ...

  10. Oracle ASM 常用命令

    01, 查看磁盘路径 select name,path,group_number from v$asm_disk_stat; 02, 查看磁盘组信息 select state,name,type,to ...