qt 创建线程
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 创建线程的更多相关文章
- Qt QThread 线程创建,线程同步,线程通信 实例
1. 继承QThread, 实现run()方法, 即可创建线程. 2. 实例1 代码 myThread.h #ifndef MYTHREAD_H #define MYTHREAD_H #includ ...
- QT 创建一个线程播放监控视频
1.创建一个线程类(PlayVideoThread): PlayVideoThread.h头文件 #pragma once #include <QObject> #include &quo ...
- Qt之线程基础
何为线程 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据计算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲.这是一个两个进程并行工作的例 ...
- Qt经典—线程、事件与Qobject(耳目一新)
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
- 界面编程之QT的线程20180731
/*******************************************************************************************/ 一.为什么需 ...
- Qt经典—线程、事件与Qobject
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
- Qt 子线程更新Ui
最近做练习,写一个Qt版的飞机大战,需要用子线程更新UI,发现Qt子线程不能更新Ui,否则程序会崩溃.在网上百度了下,说是需要在子线程自定义信号,然后在线程回调的run()函数里发射信号,主线程连接信 ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- [笔记]linux下和windows下的 创建线程函数
linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...
随机推荐
- chrome 相关设置.
1. 使用chrome 添加道桌面的快捷方式,自动打开两个 tab 解决方法: chrome://apps/ 右击 你的应用图标..勾选在新窗口打开.
- [BZOJ 1489][HNOI2009]双递增序
传送门 满满的负罪感,昨晚的刷题历程:写几道难题吧-->算了,还是只切道水题吧-->RNG赢了...... 背包一下就行了 #include <bits/stdc++.h> u ...
- LeetCode记录之21——Merge Two Sorted Lists
算法和数据结构这东西,真的是需要常用常练.这道看似简单的链表合并题,难了我好几个小时,最后还是上网搜索了一种不错算法.后期复习完链表的知识我会将我自己的实现代理贴上. 这个算法巧就巧在用了递归的思想, ...
- Web下TreeView同一节点连续点击,只执行一次SelectedNodeChanged的解决
Web下TreeView同一节点连续点击,只执行一次SelectedNodeChanged的解决 http://blog.csdn.net/net_boy/archive/2009/11/05/477 ...
- PIE SDK地图图层控制
1. 功能简介 地图图层控制就是图层的相关操作,如地图图层数据的添加.删除.移动和拖拽等功能. 2. 功能实现说明 2.1. 实现思路及原理说明 第一步 图层添加是调用AddLayer方法将图层添加到 ...
- PIE SDK打开栅格数据
1. 功能简介 GIS将地理空间数据表示为矢量数据和栅格数据.矢量数据模型使用点.线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点.河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联. ...
- PIE SDK与Matlab结合说明文档
1.功能简介 Matlab是三大数学软件之一,它在数学类科技应用软件中在数值计算方面首屈一指.Matlab可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其他编程语言的程序等,主要应用于 ...
- 转 AIX7.2+11.2.0.4RAC实施
参考 https://blog.csdn.net/alangmei/article/details/18310381 https://blog.csdn.net/smasegain/article/d ...
- centos7.3下安装redis3.2 yum安装
1.进入centos 2.运行:yum install redis 3.安装完成后,选择y,确认 4.进入:cd /etc/;vi redis.conf 将,daemonize 修改为yes,并且添加 ...
- Vue如何封装多个全局过滤器到一个文件
#### 在写vue项目时,所用的过滤器很多时,把所有的过滤器方法封装在一个文件中,然后导出,并绑定在vue实例上 1.在src下创建filters文件夹,并新建index.js文件 2. index ...