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子窗口在主窗口里显示,并共享主窗口 ...
随机推荐
- atom无法安装插件的解决方法之一
atom通过setting中无法下载插件,通过apm也无法下载插件,可能是网络.config配置的问题,不好解决. 下面的方法全手动,基本属于万金油方法: 1,在atom的setting页面中点击op ...
- [LeetCode] Find the Celebrity 寻找名人
Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist o ...
- Firefox默认英文修改中文
对于firefox,中文还是看着顺眼,为了自己的顺心.动起手来,自力更生,丰衣足食! 01.确定Linux的firefox版本 firefox -v 02.下载对应版本的中文语言包 http://ft ...
- 常用 Git 命令清单
我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下 ...
- jquery-三级联动
html <!DOCTYPE html> <html> <head> <meta charset=gbk /> <title>selectL ...
- PRINCE2特征(二)
英国体系环境下项目有什么特征(二) 今天又要和大家分享了,这个时间也是自己很喜欢的时刻.上次给大家分享的是英国体系下项目的特征之一:临时性.不知道大家还有没有印象,英国体系下项目的特征有五个,今天来给 ...
- Android基础测试题(四)
看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...
- 搭建自己的网站之一:如何在linux下使用tomcat
1. 要打造自己的网站,首先应该有属于自己的服务器.个人的话可以在阿里云或者腾讯云购买云主机,需要的话再购买一个域名,与自己的公网ip绑定(不然只能由ip地址访问,当然,自己用来练手的话是没什么问题的 ...
- 微博轻量级RPC框架Motan
Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...
- Linux如何进行文件管理
Linux中的所有数据都被保存在文件中,所有的文件被分配到不同的目录.目录是一种类似于树的结构,称为文件系统.当你使用Linux时,大部分时间都会和文件打交道,通过本节可以了解基本的文件操作,如创建文 ...