对于线程过去写的比较少,现在也几乎是小白的水平。先创建Qt empty project,即Qt空项目,打开QtCreate->文件->新建文件或项目->其它项目->empty qmke project,接着按提示创建Qt空项目,创建之后,在项目上右键添加新文件,选择源文件,创建main.cpp文件,添加如下代码:
main.cpp

#include <QtCore>int main(int argc,char* argv[])
{QCoreApplication app(argc,argv);return app.exec();
}

再添加新文件,选择类,基类为QThread,类名为myThread,最后添加代码后文件内容为:
myThread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QThread>class myThread : public QThread
{Q_OBJECT
public:explicit myThread(QObject *parent = nullptr);
protected:void run();
private:
//    volatile bool stopped;
};#endif // MYTHREAD_H

myThread.cpp

#include "mythread.h"
#include "Counter.h"
#include <QDebug>myThread::myThread(QObject *parent):QThread(parent)
{//    stopped = false;
}void myThread::run()
{Counter counter;quint8 i = 4;while(i--){counter.increment();
//        int n = counter.GetValue();
//       qDebug()<<QString("n:").arg(counter.GetValue());qDebug()<<"n:"<<counter.GetValue();}
}

再添加另一个线程类,同样在项目上右键添加新文件,选择类,类名mythreadread,基类为QThread,创建好这个类之后,添加完代码之后,文件内容如下:
mythreadread.h

#ifndef MYTHREADREAD_H
#define MYTHREADREAD_H#include <QThread>class mythreadread : public QThread
{Q_OBJECT
public:explicit mythreadread(QObject *parent = nullptr);
protected:void run();
};#endif // MYTHREADREAD_H

mythreadread.cpp

#include "mythreadread.h"
#include "Counter.h"
#include <QDebug>mythreadread::mythreadread(QObject *parent):QThread(parent)
{}void mythreadread::run()
{Counter counter;quint8 i = 4;while(i--){counter.decrement();qDebug()<<"n="<<counter.GetValue();}
}

以上两个线程类创建完成之后,在项目上右键添加新文件Counter.h,即添加头文件,添加之后,修改其代码如下:
Counter.h

#ifndef COUNTER_H
#define COUNTER_Hclass Counter
{public:Counter():n(0){}void increment(){n++;}void decrement(){n--;}int GetValue()const{return n;}//该函数不能修改类成员变量的值
private:int n;
};
#endif // COUNTER_H

现在在main函数中修改代码如下:
main.cpp

#include <QtCore>
#include "mythread.h"
#include "mythreadread.h"myThread thread1;
mythreadread thread2;int main(int argc,char* argv[])
{QCoreApplication app(argc,argv);//针对各自线程中的特定对象的成员操作,互不影响thread1.start();thread1.wait();thread2.start();thread2.wait();return app.exec();
}

运行程序,结果如下:
n: 1
n: 2
n: 3
n: 4
n= -1
n= -2
n= -3
n= -4
结论:第一个线程启动后,在其线程函数中创建了Counter的类对象,并循环调用四次Counter类的加计数函数,然后输出每一次加计数后的值,最后调用wait()函数等待线程的结束,第一个线程结束之后,启动第二个线程,在该线程中对Counter类的成员变量减计数,并输出每一次减计数后的值,最后等带线程二结束之后,主程序关闭。其中有三个点需要注意:

  1. 在Counter类的定义中,将函数的声明与定义放在了同一个文件Counter.h中。需要注意的是,在同一个文件中定义并声明一个类时,函数的定义不能在该类外,否则会出现错误提示,重定义该文件。像下面所写一样:
#ifndef COUNTER_H
#define COUNTER_Hclass Counter
{public:Counter():n(0){}int GetValue();
private:int n;
};
void Counter::GetValue()
{return n;
}
#endif // COUNTER_H

这样在类中定义成员函数,会导致编译错误,只能在类中进行定义。

#ifndef COUNTER_H
#define COUNTER_Hclass Counter
{public:Counter():n(0){}int GetValue(){return n;}
private:int n;
};#endif // COUNTER_H
  1. 引入可重入的概念,一个类可以被多个线程使用,但每一次只能是调用该类自己的成员函数或成员变量。上面两个线程,在run()函数中分别对Counter类的成员函数进行操作,针对的是每一个Counter类自己的成员函数的操作,所以两个线程之间没有涉及到数据共享,线程同步等问题,可以线程实际是独立的。
  2. 如果将main.cpp中主函数中的两个线程的启动顺序变为如下:
     thread1.start();thread2.start();thread1.wait();  thread2.wait();

那么程序的运行结果是怎么样呢?其运行结果如下:
n: 1
n= -1
n: 2
n= -2
n: 3
n= -3
n: 4
n= -4
可以看出,两个线程几乎是同时运行的,他们之间并行运行各自的run()函数,在对Counter类操作时,n的初始值都是从0开始,互不影响。
附加总结:
创建线程的方法之一是创建一个继承自QThread的类,引入#include头文件,在类的声明的开头加入Q_OBJECT宏,在类中重写run()函数,在类定义中对run()函数进行定义,即线程需要做的事情在run()函数中编写,线程类便创建完成了。线程调用时引入线程所在类的头文件,在需要线程的地方,定义线程对象,并调用start()函数启动线程,线程结束的地方可以调用stop()函数停止线程,但在之前最好加上wait()函数等待线程的结束。

terminate的说明

terminate并不会立即终止线程,它取决于系统的调度,此外调用这个函数时最好在其后调用一下wait()函数等待线程结束,但是terminate()存在危险性,因为无法知道它在何时会关闭线程,而且关闭线程时不会做清理工作,尽量少用。

Qt中线程的简单使用相关推荐

  1. Qt中线程的生命期问题

    文章目录 1 Qt中线程的生命期问题 1.1 Qt中线程的生命期问题 1.2 同步型线程设计 1.3 在异步型线程设计 1 Qt中线程的生命期问题 1.1 Qt中线程的生命期问题 一个工程中实际的问题 ...

  2. Qt中QSS的简单使用

    样式表的组成 样式表由两大元素组成:选择器和声明.选择器实际上可以理解为对象,声明则是对该对象的属性的设置. 样式表的使用 方法一:在代码中调用setStyleSheet()来设置样式: 方法二:通过 ...

  3. C ++中线程的简单示例

    有人可以发布一个简单的示例来说明如何在C ++中启动两个(面向对象)线程. 我正在寻找可以扩展运行方法(或类似方法)的实际C ++线程对象,而不是调用C样式线程库. 我遗漏了任何特定于OS的请求,希望 ...

  4. 关于Qt中线程的挂起和唤醒问题

    为了平台的可移植性,现在好多公司或开发者都在用Qt开发,但是Qt开发文档有一个不非常理想的问题是,有些问题描述的不是太详细,特别是涉及到线程的挂起,唤醒.和sleep()等问题. 在Qt开发中,有许多 ...

  5. Qt中线程同步的几种方法详解

    1.QMutex类 QMutex类就像一把锁,在互斥量以前上锁(QMutex::lock()),而后在使用完互斥量以后解锁(QMutex::unlock()).好比下面的代码:函数 void some ...

  6. 【QT中使用post】

    最近要使用post进行通信,就研究一下QT中Post的简单实用,基本上是最基础的了,也仅限于客户端. .h文件: QNetworkAccessManager *accessManager=nullpt ...

  7. qt延时 QT中简单的延时办法

    来自 http://www.qtgtk.com/qt延时-qt中简单的延时办法/ QEventLoop eventloop; QTimer::singleShot(time, &eventlo ...

  8. 简单说说对QT中moveToThread实现多线程操作的理解

      在平时的编码过程中经常碰到QT的多线程问题,也大量接触了QT中的两种主流多线程写法,一种是继承QThread类并重载run函数,在run函数中写一个状态机或者计时器来实现对线程运作:一种是通过mo ...

  9. Qt中另一种创建线程的方式

    文章目录 1 Qt中另一种创建线程的方式 1.1 另一种创建线程的方式 1.2 同步型线程的设计 1.3 异步型线程的设计 1 Qt中另一种创建线程的方式 1.1 另一种创建线程的方式 历史的痕迹: ...

最新文章

  1. 浏览器插件 火狐插件
  2. 第七阶段 jsp(369---el---jstl)
  3. oracle如何计算2个坐标的距离,百度地图两个坐标之间的距离计算
  4. Bootstrap-学习系列
  5. hive拉链表实现方案一
  6. php基础 简书,PHP的基础(一)
  7. Bret Victor(苹果 UI 设计师):互动的未来不应只在手指上
  8. 怎么调节手机的刷新率_【W21 5G性能篇】120Hz自适应刷新率,用了再也回不去
  9. ts250服务器开启虚拟,ts250服务器恢复系统
  10. Direct Rendering Manager (DRM)
  11. Java基于ssm开发的古董竞标拍卖系统也可以改成拍卖品网站
  12. JK latch JK触发器 【数字电路】
  13. java核心之类和对象
  14. 最近发现了一个高清计算机电子书和源码的网址
  15. 沟通修炼 I型沟通->U型沟通
  16. [渝粤教育] 西南科技大学 网站建设与维护 在线考试复习资料
  17. iptables 限制网速
  18. 张驰咨询:精益生产(LP)、六西格玛(Sixsigma)、精益六西格玛(LSS)的区别是什么?
  19. Config-Server
  20. 工具-Ditto与X mouse Button,自定义热键复制粘贴Ctrl C /V,解放双手

热门文章

  1. 储留香:一个智能运维系统就是一个中枢神经系统,我说的!
  2. 微软KV Store Faster如何巧妙实现1.6亿ops
  3. 一个优秀的可定制化Flutter相册组件,看这一篇就够了
  4. Node.js 应用故障排查手册 —— 利用 CPU 分析调优吞吐量
  5. Spring Cloud Alibaba迁移指南(三):极简的 Config
  6. 云云协同解决方案全景图发布 华为云助力科技企业云上创新
  7. 大数据 Spark :利用电影观看记录数据,进行电影推荐 | 原力计划
  8. 阿里云宣布3年再投2000亿
  9. MySQL数据库无完整备份删库,除了跑路还能怎么办?
  10. 再提“鸿蒙”,任正非说这是为物联网而生;硅谷公司年薪报告出炉,谷歌年薪居榜首;苹果CEO库克接班人浮出水面,苹果高层或大换血?...