- 若在Qt准备使用线程类一般有两种方式(1) 采用WorkObject配合QThread进行使用 (2)继承QThread, 重载run()函数即可。
- 注:采用Qt::Concurrent之类的不在本文讨论范围内.
方式一、采用WorkObject配合QThread进行使用
- 创建一个用于计算的对象,该对象的运算相关函数防止在public slots 下:
//..Object.h class CObject : public QObject { Q_OBJECT public: explicit CObject(QObject *parent = 0); ~CObject(); signals: void sigFinish(const QString &s); //跨线程请注意使用const public slots: void Run(); void Stop(); private: bool m_bStop; }; //..Object.cpp CObject::CObject(QObject *parent) : QObject(parent),m_bStop(false) { } void CObject::Run() { int i = 0; while(1) { if(m_bStop) { return; } qDebug()<<"Object TheradID = "<<QThread::currentThreadId(); qDebug()<<"Run i = "<<i; sleep(1); if(++i == 10) { emit sigFinish("Finish");//信号是线程安全的,当然这得扯到后面的连接方式 } } } void CObject::Stop() { m_bStop = true; emit sigFinish("Stop");//!!按照需求添加 }
- 创建一个测试对象CTest
//..test.h class CTest : public QObject { Q_OBJECT public: explicit CTest(QObject *parent = 0); void Run(); void Stop(); signals: private slots: void slotFinish(const QString &); private: QList<CObject *> m_ListObj; }; //..test.cpp CTest::CTest(QObject *parent) : QObject(parent) { } void CTest::Run() { QThread *pThread = new QThread(this); // 只充当一个作为另个线程的入口 CObject *pObj = new CObject; //注意:moveToThread不能使用在双亲对象上 m_ListObj.append(pObj); qDebug()<<"Current Main Run Thread = "<<QThread::currentThreadId(); connect(pObj,SIGNAL(sigFinish(QString)),pObj,SLOT(deleteLater())); connect(pObj,SIGNAL(sigFinish(QString)),pThread,SLOT(quit())); connect(pObj,SIGNAL(sigFinish(QString)),this,SLOT(slotFinish(QString))); connect(pThread,SIGNAL(started()),pObj,SLOT(Run())); connect(pThread,SIGNAL(finished()),pObj,SLOT(deleteLater())); pObj->moveToThread(pThread); pThread->start(); } void CTest::Stop() { foreach (CObject *pObj, m_ListObj) { if(!QMetaObject::invokeMethod(pObj,"Stop",Qt::DirectConnection))//!!留个坑,为什么autoConnection会没反应 { qDebug()<<"error"; } } m_ListObj.clear(); } void CTest::slotFinish(const QString &s) { qDebug()<<"Main Thread Receive:"<<s; }
- main.cpp
//..main.cpp int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); CTest test; test.Run(); sleep(5); test.Stop(); return a.exec(); }
- 执行结果
Well Done,方式2见Qt线程(2) QThread中使用WorkObject?
Qt线程(1) moveToThread的更多相关文章
-
Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)
Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...
-
Qt——线程与定时器
一.定时器QTimer类 The QTimer class provides repetitive and single-shot timers. The QTimer class provides ...
-
Qt 线程基础(QThread、QtConcurrent等)
[-] 使用线程 何时使用其他技术替代线程 应该使用 Qt 线程的哪种技术 Qt线程基础 QObject与线程 使用互斥量保护数据的完整 使用事件循环防止数据破坏 处理异步执行 昨晚看Qt的Manua ...
-
Qt 线程基础
(转自:http://my.oschina.net/laopiao/blog/88158) 何谓线程? 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据 ...
-
QT线程使用收集示例
关于多线程问题: Qt和Boost做跨平台的线程封装,OpenMP主要做并行计算,让不精通多线程的人也能高效地利用CPU的计算能力.个人倾向于用boost.thread, boost.mpi. 一 ...
-
Qt 线程基础(QThread、QtConcurrent等) 2
使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线 ...
-
Qt 线程基础(QThread、QtConcurrent、QThreadPool等)
使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使 ...
-
Qt线程(2) QThread中使用WorkObject
一般继承QThread的WorkThread都会在重载的run()中创建临时的WorkObject,这样能确定这个WorkObject在该thread中使用 那如果这个WorkObject是个Sing ...
-
详解 Qt 线程间共享数据(用信号槽方式)
使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...
随机推荐
-
(转)LitJson 遍历key
本文转载自:http://blog.csdn.net/inlet511/article/details/47127579 用LitJson插件获取到的对象,如果想遍历对象中包含的子对象的key,可以用 ...
-
qt 关于内存泄漏的检测
Qt 关于内存泄露的检测: 收藏人:guitarhua 2012-02-10 | 阅: 转: | 来源 | 分享 Qt 关于内存泄露的检测:工具篇 ...
-
将汉字转为UTF-8编码
01./** 02. * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名. 03. * @param s 原文件名 04. * @return 重新编码后的文件名 05. */ ...
-
深入理解Javascript闭包概念
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部能够直接读取全局变量 ...
-
[Wc2010]重建计划
Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案, ...
-
C语言中你可能不熟悉的头文件(stdlib.h)
C语言中你可能不熟悉的头文件<cstdlib>(stdlib.h) C Standard General Utilities Library (header) C标准通用工具库(头文件) ...
-
iptables防火墙常用配置介绍
参考地址 http://www.cnblogs.com/metoy/p/4320813.html http://netfilter.org/ iptables http://man.chinaunix ...
-
Got fatal error 1236原因和解决方法
一 前言 MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到“Got fatal erro ...
-
Leetcode 1013. 总持续时间可被 60 整除的歌曲
1013. 总持续时间可被 60 整除的歌曲 显示英文描述 我的提交返回竞赛 用户通过次数450 用户尝试次数595 通过次数456 提交次数1236 题目难度Easy 在歌曲列表中,第 i 首 ...
-
【Unity Shader】(七) ------ 复杂的光照(下)
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Sha ...