Qt - QThread(翻译帮助文档)
QThread Class 详细描述
QThread 类提供一个平台无关的方法来管理线程。
一个QThread对象管理一个程序中的控制线程。QThread在run()中开始执行任务。默认地,run()通过调用exec()开始事件循环,并且在线程中运行Qt事件循环。
你可通过使用QObject::moveToThread()将worker对象移到线程中来使用worker对象。
class Worker : public QObject
{
Q_OBJECT public slots:
void doWork(const QString ¶meter) {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
} signals:
void resultReady(const QString &result);
}; class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &Controller::operate, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Controller::handleResults);
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &);
signals:
void operate(const QString &);
};
Worker槽中的代码会在一个单独的线程中执行。然而,你可以自由地将Woker的槽和任何信号相连,不管信号来自哪个对象,在哪个线程中。一个叫做queued connections的机制保证跨不同线程的信号(signals)和槽(slots)的连接(connect)是安全的。
另外一种将代码运行在独立线程的方法是通过QThread的子类重新实现run()。例如:
class WorkerThread : public QThread
{
Q_OBJECT
void run() Q_DECL_OVERRIDE {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
}
signals:
void resultReady(const QString &s);
}; void MyObject::startWorkInAThread()
{
WorkerThread *workerThread = new WorkerThread(this);
connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
workerThread->start();
}
在上述示例中,线程在run()返回后会退出。线程中没有任何事件循环执行除非你调用exec()。
需要记住的是QThread实例依存于实例它的旧线程中,不是在调用run()的新线程中。这意味着所有QThread的队列化的槽会在旧线程中执行。因此,开发者想要在新线程中调用槽函数需要使用工作者对象方法(woker-object approach);新的槽函数不应该直接在QThread的子类中实现。
当定义QThread的子类时,需注意子类的构造函数(constructor)在旧线程中执行,run()在新线程中执行。如果一个成员变量被两个函数访问,则该成员变量是在不同的线程中访问,需要检查访问是否安全(线程同步)。
线程管理
QThread在线程started()和finished()时会通过信号(signa)通知你,或者你可以通过isFinished()和isRunning()查询线程的状态。
你可以通过调用exit()或者quit()停止线程。极端情况下,你可能想通过terminate()强制结束一个线程,但是这样做是危险的,不鼓励如此。
从Qt4.8开始,当线程刚刚结束时,可以将线程中的对象释放(deallocate),方法是连接finished()信号和QObject::deleteLater()。
使用wait()阻塞调用线程,直到其他线程执行完成(或者指定的时间已过)。
QThread也提供静态的、平台无关的睡眠函数(sleep):sleep(),msleep(),usleep(),分别的精度是秒,毫秒,微秒。
Note:wait()和sleep()函数一般不需要,因为Qt是一个事件驱动框架。考虑监听finished()信号替换wait()函数,用QTimer替换sleep()函数。
静态函数currentThreadId()和currentThread()返回当前执行线程的标识。前者返回平台为线程指定的ID,后者返回一个QThread指针。
在启动线程之前调用setObjectName(),可选择线程名字(类似于linux命令 ps -L)。如果不调用setObjectName(),给定的线程名字是线程对象运行时类名字。注意在Windows系统release builds时,该函数暂不可用。
Qt - QThread(翻译帮助文档)的更多相关文章
- 翻译qmake文档(四) Building Common Project Types
翻译qmake文档 目录 本章原英文文档:http://qt-project.org/doc/qt-5/qmake-common-projects.html 构建常见的项目类型 本章描述 ...
- 翻译qmake文档(三) Creating Project Files
翻译qmake文档 目录 原英文文档:http://qt-project.org/doc/qt-5/qmake-project-files.html 创建项目文件 项目文件包含qmake构建你 ...
- 翻译qmake文档(二) Getting Started
翻译qmake文档 目录 原英文文档: http://qt-project.org/doc/qt-5/qmake-tutorial.html 本教程教讲授qmake基础知识.这个手册里 ...
- 翻译qmake文档(一) qmake指南和概述
翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...
- 翻译qmake文档 目录
利用空闲时间把qmke的文档翻译出来,翻译水平有限,有些地方翻译的不好,请谅解, 如果您能指出来,我会很感激并在第一时候做出修改. 翻译qmake文档(一) qmake指南和概述 翻译qmake文档( ...
- 利用Qt Assistant 定制帮助文档
为了将Qt Assistant定制为自己应用程序的帮助文档浏览器.需要完成以下几步: 一.导入HTML格式的帮助文档 (1)首先,针对自己的应用程序创建HTML格式的帮助文档,请参见<Doxyg ...
- Google翻译PDF文档
Google翻译PDF文档 翻译软件虽多如牛毛,但有关整段/全文翻译,堪用的软件极少, 涉及专业技术的文献.胜任翻译工作的人力稀缺.少不了project师讴心沥血. 由于多是PDF格式.即使要翻译个概 ...
- 2.QT中操作word文档
Qt/Windows桌面版提供了ActiveQt框架,用以为Qt和ActiveX提供完美结合.ActiveQt由两个模块组成: A QAxContainer模块允许我们使用COM对象并且可以 ...
- 自动化翻译ceph文档
需求很简单,翻译官网的操作文档 下载ceph代码luminous版本 这个只用来编译doc的,我们只需要最新的这个分支即可,拉最少的代码 git clone -b v12.2.13 --single- ...
- Qt 的MDI 多文档窗口
一.MDI简介 MDI就是多文档界面(Multi-document Interface,MDI)应用程序 MDI就是在主窗口里创建多个同类型的MDI子窗口,这些MDI子窗口在主窗口里显示,并共享主窗口 ...
随机推荐
- win10+vs2013+cuda8.0+caffe
1,首先说下环境和配置 配置: 环境:windows10,vs2013 community,cuda8.0,caffe,cudnn4 注意:先要安装好显卡驱动(我的显卡是1070),这里的例子只开通了 ...
- [LeetCode] Scramble String 爬行字符串
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- 如何在一台新电脑上配置JAVA开发环境
对于JAVA新手来说,刚开始要学JAVA,而自己的电脑上毫无与JAVA开发有关的环境,应该如何进行配置呢? (安卓新手也需要JAVA开发环境) 第一步,下载.安装java JRE JRE (Java ...
- EF查询之性能优化技巧
上一篇:EF使用CodeFirst方式生成数据库&技巧经验 前言 EF相信大部分同学都已经经常使用了,可是你的查询高效吗? 今天我就以个人使用经验来讲讲在使用EF做查询的时候大家都容易忽略的性 ...
- 外网访问内网工具ngrok tunnel 使用总结
需求分析 在软件开发测试过程中,我们会经常遇到需要网站部署测试.给客户演示.APP开发的调试这样的需求.通常的做法是申请一个域名和空间,将网站放到外网上给客户演示. 这种方法确实可行不过会有两点不好, ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- StarUML license key
参考博客:http://blog.csdn.net/Excing/article/details/48998891 方法 将StarUML/www/license/node/LicenseManage ...
- redis 命令
添加数据 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo } span.s1 { } set key value //添加多条数据 ...
- vuex 初体验
vuex是vue的状态管理工具,vue进阶从es6和npm开始,es6推荐阮一峰大神的教程. vuex学习从官方文档和一个记忆小游戏开始.本着兴趣为先的原则,我先去试玩了一把-->. Vuex ...
- 第一次源码分析: 图片加载框架Picasso源码分析
使用: Picasso.with(this) .load("http://imgstore.cdn.sogou.com/app/a/100540002/467502.jpg") . ...