Qt多线程学习-用例子来理解多线程
文章出处:DIY部落(http://www.diybl.com/course/3_program/c/c_js/20090303/157373_3.html)
{
public:
MThread();
~MThread();
void run();
void foo();
...
};
{
...
MThread *mythread;
};
MDialog::MDialog()
{
mythread = new MThread;
...
}
需要注意的是,在QT中,QThread对象的实例mythread是属于创建它的线程(线程A,即MDialog所在的线程)的,mythread的所有程序代码与数据都放在与MDialog相同的空间中.这时的mythread,就像任何普通的自己定义的类的实例一样.但是在调用mythread->start()之后,mythread的run()函数中的代码会在新的线程(线程B)中执行.在run()函数中声明的变量\实例化的对象,都属于线程B.但是mythread的所有代码,都还在存储在线程A中,只是run()函数的"执行"是在线程B中.
foo()是在线程A中执行的.
当emit sigDialogSignal()时,是会在MDialog所在的线程A中执行的.因为mythread与MDialog同属于一个线程, 这时thread可以看做一个普通类的实例.另外,因为connect函数的连接方式默认是自动连接,而对同属于一个纯种的两个对象,自动连接会使用直接连接,即slot在发出signal的线程中立即执行.
: QThread(parent)
{
myTimer.start(1);
connect(&myTimer, SIGNAL(timeout()), this, SLOT(slotPrint()));
}
MThread::~MThread()
{
}
void MThread::run()
{
for (int i = 0; i < 100; ++i) {
for (int j = 0 ; j < 10000; ++j) {
qDebug()<<"---------"<<i;
}
}
exec();
}
void MThread::slotPrint()
{
qDebug()<<"==============================";
}
运行后出现:
...
---------9
==============================================================
---------9
...
...
不能误以为:在一个QThread类的派生类中,run()函数中的语句在运行时,可能被本线程定时器超时slot中断. (错误)
{
while(1) {
dosomething(); //此循环永不退出 }
exec(); //如果此事件循环不能进入,刚此线程不会收到任何signal }
POINT 3:线程A中的指针可指向线程B中创建的对象实例, 这个实例属于线程B. 指针仅仅是一个地址, 而对象实例的变量/代码等都属于线程B.
{
Q_OBJECT
public:
MThread(QObject *parent = 0);
~MThread();
void run();
MPrint *mprint;
};
void MThread::run()
{
mprint = new MPrint;
exec();
}
//如此声明,mprint所指向的对象属于另一个线程.例2:
{
Q_OBJECT
public:
MThread(QObject *parent = 0);
~MThread();
void run();
MPrint *mprint;
private:
QTimer *myT
文章出处:DIY部落(http://www.diybl.com/course/3_program/c/c_js/20090303/157373.html)
private slots:
void slotPrint();
void testFoo();
};
void MThread::run()
{
myTimer = new QTimer;
mprint = new MPrint;
myTimer->setInterval(100);
connect(myTimer, SIGNAL(timeout()), this, SLOT(testFoo()), Qt::DirectConnection);
QTimer::singleShot(0, myTimer,SLOT(start()));
exec();
}
以上这样写run(),myTimer在run()中new,即myTimer这个指针属于旧线程,但myTimer所指向的QTimer实例的实体在新的线程中,testFoo()会在新线程中执行.
{
QTimer myTimer;
mprint = new MPrint;
myTimer.setInterval(100);
connect(&myTimer, SIGNAL(timeout()), this, SLOT(testFoo()), Qt::DirectConnection);
QTimer::singleShot(0, &myTimer,SLOT(start()));
//testFoo(); exec();
}
以上这样写run(),myTimer在run()中声明,即myTimer属于新的线程,testFoo()也会在新线程中执行.
{
Q_OBJECT
public:
MThread(QObject *parent = 0);
~MThread();
void run();
MPrint *mprint;
private:
QTimer myTimer;
private slots:
void slotPrint();
void testFoo();
};
void MThread::run()
{
mprint = new MPrint;
myTimer.setInterval(100);
connect(&myTimer, SIGNAL(timeout()), this, SLOT(testFoo()));
QTimer::singleShot(0, &myTimer,SLOT(start()));
//testFoo(); exec();
}
以上这样写run(),testFoo()会在创建myTimer的老线程中执行.因为可以看到,mytimer和this(即mythread),都是在同一个线程中,只是在另一个线程中(run()),做了connect操作.
: QThread(parent)
{
myTimer.start(1);
connect(&myTimer, SIGNAL(timeout()), this, SLOT(slotPrint()));
}
MThread::~MThread()
{
}
void MThread::run()
{
exec();
}
void MThread::slotPrint()
{
qDebug()<<"===========================";
for (int i = 0; i < 100; ++i) {
for (int j = 0 ; j < 10000; ++j) {
qDebug()<<"---------"<<i;
}
}
}
slotPrint()函数运行完之后才会退出,说明slot不会中断slot,一个slot在执行完之后才会执行下一个slot.
: QThread(parent)
{
myTimer.start(1);
connect(&myTimer, SIGNAL(timeout()), this, SLOT(slotPrint()));
}
MThread::~MThread()
{
void MThread::run()
{
testFoo();
exec();
}
void MThread::slotPrint()
{
qDebug()<<"=======================";
}
void MThread::testFoo()
{
for (int i = 0; i < 100; ++i) {
for (int j = 0 ; j < 10000; ++j) {
qDebug()<<"---------"<<i;
}
}
}
以上代码中,slotPrint()与testFoo()会在两个不同的线程中执行.
http://blog.csdn.net/liuguangzhou123/article/details/7665198
Qt多线程学习-用例子来理解多线程的更多相关文章
- Qt多线程学习-用例子来理解多线程(转),这个是我看过最好的文章,总结很详细(感觉exec()的作用就是保持线程不退出,这样方便随时处理主线程发来的信号,是一种非常别致的思路)good
01 class MThread :public QThread 02 { 03 public: 04 MThread(); 05 ~MThread(); 06 virtual ...
- Java多线程学习(一)Java多线程入门
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79640870 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
- Java多线程学习---------超详细总结(java 多线程 同步 数据传递 )
目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么 ...
- Java多线程学习笔记(一)——多线程实现和安全问题
1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...
- 【转】Delphi多线程学习(9):多线程数据库查询(ADO)
原文:http://www.cnblogs.com/djcsch2001/articles/2382559.html ADO多线程数据库查询通常会出现3个问题: 1.CoInitialize 没有调用 ...
- Java多线程学习(四)等待/通知(wait/notify)机制
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79690279 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
- Java多线程学习(二)synchronized关键字(1)
转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...
- C#多线程学习之(五)使用定时器进行多线程的自动管理
本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执 ...
- Java多线程学习(三)volatile关键字
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
随机推荐
- 【序列操作V】平衡树(无旋treap)
题目描述 维护一个队列,初始为空.依次加入 n(1≤n≤105)个数 ai(-109≤ai≤109),第 i(1≤i≤n)个数加入到当前序列第 bi(0≤bi≤当前序列长度)个数后面.输出最终队列. ...
- 开源项目学习之------AG-Admin环境搭建
原文地址: https://blog.csdn.net/u011781521/article/details/79056974 一.框架简介 AG-Admin是基于Spring Cloud微服务化开发 ...
- VS2012经常使用的快捷方式完成最全面
(1)如何更改设置快捷键 1.转到工具----选项 对话框 2.选 环境---->键盘 3.在 [显示命令包括] 以下的对话框中输入"对齐"keyword,然后就会在这个 ...
- Scheme语言--简单介绍
一年前事实上有时间看完SICP这本书,后来由于种种原因,一直没有继续再学.由于SICP中使用Scheme确实应用不多.在Java,C++的语言眼里,Scheme确实非常另类.现在MIT已经放弃了使用S ...
- 深度剖析:最新云端开发工具如何实现敏捷+DevOps开发落地
相信很多软件开发人员们对今年国内新兴的云端开发工具——华为软件开发云都有耳闻,有些人可能还免费体验过,由于它5人以下的团队是免费使用的,很庆幸本人的这个项目正好5个人,就注册使用了.下面就自己的使用心 ...
- 关于MOVE 和 CopyMemory 的用法区别
最近做了一个数据采集服务器, 根据程序的框架,使用了大量的指针结构体(内存块) 操作. 例子: PArrayByte = ^TArrayByte; TArrayByte = packed recor ...
- VS2010中新控件的编程------颜色按钮类和颜色对话框
(1) 颜色按钮类和颜色对话框 1) 颜色对话框 MFC提供了颜色对话框类CMFCColorDialog进行颜色的选择,系统可以利用DoModal()调用,然后选择相应的颜色. CMFCCo ...
- 在sql语句中 inner join ,left join,right join 和on 以及where
当使用几种join的时候,on是指表连接起来基于的条件,where是对连接的表进行过滤的条件. where 1=1 当我们需要拼接字符串的时候 在基础sql字符串中写上where 1=1 可以不需要 ...
- matlab 二元函数的画法
plot:画线(curve,二维空间以及三维空间) surf:画面(surface,一般在三维空间) 1. surf 绘图函数 surf 是 surface 的缩写,表示表面(显然至少三维图像才会有表 ...
- WPF 自定义的图表(适用大量数据绘制)下
原文:WPF 自定义的图表(适用大量数据绘制)下 上一篇文章中讲了WPF中自定义绘制大量数据的图标,思路是先将其绘制在内存,然后一次性加载到界面,在后续的调试过程中,发现当数据量到达10W时,移动鼠标 ...