• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > lesson15-QT多线程

lesson15-QT多线程

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了多线程,java多线程,多线程编程,c#多线程,多线程是什么意思等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

lesson15-QT多线程


一、什么是线程
1、线程
进程:一个正在执行的程序,它是资源分配的最小单位
线程:程序执行的最小单位

进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。

2、线程的术语
并发是指在同一时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。
看起来同时发生

并行是指在同一时刻,有多条指令在多个处理器上同时执行。
真正的同时发生

同步:彼此有依赖关系的调用不应该“同时发生”,而同步就是要阻止那些“同时发生”的事情
异步的概念和同步相对,任何两个彼此独立的操作是异步的,它表明事情独立的发生

3、线程的优势
1)、在多处理器中开发程序的并行性
2)、在等待慢速IO操作时,程序可以执行其他操作,提高并发性
3)、模块化的编程,能更清晰的表达程序中独立事件的关系,结构清晰
4)、占用较少的系统资源

多线程不一定要多处理器
GUI程序中经常会使用多线程技术,一个线程用来响应界面,而其他线程就可以在后台处理冗长的操作
Qt的元对象系统支持不同线程中的对象使用信号和槽机制通信




二、QT多线程
Qt中使用多线程是非常简单的,只要子类话QThread就可以了,在QThread中有一个protected类型的run函数,重写run函数就可以实现多线程。
1、QT线程
Qt中使用多线程是非常简单的,只要子类化QThread,然后重写run函数就可以实现多线程

class MyThread:public Thread
{
public:
MyThread();
protected:
void run();
private:
volatile boolean stopped;
}

run函数是通过线程的start方法启动的,线程还有isRunning方法来判断是否在运行,terminate方法结束线程


2、线程同步之信号量
信号量使线程不需要忙碌的等待,是对mutex的一种扩展。使用信号量可以保证两个关键代码不会并发。在进入一段关键代码时,线程必须获取信号量,退出时必须释放。信号量可以同时由多个线程访问。

Qt的信号量QSemaphore类:
acquire()用来获取资源,free()用来释放资源

生产者和消费者的例子,生产者生产的时候需要确保有足够的空间,消费者消费的时候要确保空间里有资源
QSemaphore freeByte(100) 生产有有100个空间
QSemaphore useByte(0)消费者没有资源
producer
{
freeByte.acquire()
byte = n
useByte.release()
}
consumer
{
useByte.acquire()
printf byte
freeByte.release()
}


3、线程同步之条件变量
QWaitCondition允许线程在一定条件下唤醒其他的线程,这样也可以是线程不必忙碌的等待,条件变量要配合互斥量来使用

QMutex mutex; QWaitCondition condition;
condition.wait(&mutex)
condition.wakeAll()
wait函数将互斥量解锁,并在此等待,此函数返回之前会将互斥量重新枷锁。
wakeAll函数会将所有等待该互斥量的线程唤醒


4、线程优先级
实际任务可能会让某个线程先运行,那么就需要设置线程优先级。
setPriority函数可以设置线程的优先级,或者在线程启动的时候在start函数传入线程的优先级


三、实例
1、多线程
  1. #ifndef MYTHREAD_H
  2. #define MYTHREAD_H

  3. #include <QThread>

  4. class MyThread : public QThread
  5. {
  6. Q_OBJECT
  7. public:
  8. MyThread();
  9. void stop();
  10. volatile bool stopped;
  11. protected:
  12. void run();
  13. };
  14. #endif
  1. #include "myThread.h"
  2. #include <QtDebug>

  3. MyThread::MyThread()
  4. {
  5. stopped = false;
  6. }

  7. void MyThread::run()
  8. {
  9. int i=0;
  10. while(!stopped)
  11. {
  12. qDebug()<<"thread id:"<QThread::currentThreadId()<<":"<<i;
  13. i++;
  14. sleep(2);
  15. }
  16. stopped = false;
  17. }

  18. void MyThread::stop()
  19. {
  20. stopped = true;
  21. }

2、信号量

  1. #ifndef PRODUCER_H
  2. #define PRODUCER_H

  3. #include <QThread>

  4. class Producer : public QThread
  5. {
  6. Q_OBJECT
  7. public:
  8. Producer();
  9. protected:
  10. void run();
  11. };

  12. #endif

  1. #ifndef CONSUMER_H
  2. #define CONSUMER_H

  3. #include <QThread>

  4. class Consumer : public QThread
  5. {
  6. Q_OBJECT
  7. public:
  8. Consumer();
  9. protected:
  10. void run();
  11. };

  12. #endif

  1. #include "producer.h"
  2. #include "consumer.h"
  3. #include <QDebug>
  4. #include <QSemaphore>

  5. #define SIZE 50
  6. QSemaphore freeByte(SIZE);
  7. QSemaphore useByte(0);

  8. Producer::Producer()
  9. {

  10. }
  11. void Producer::run()
  12. {
  13. for(int i=0; i<SIZE; i++)
  14. {
  15. freeByte.acquire();
  16. qDebug()<<"produer:"<<i;
  17. useByte.release();
  18. sleep(1);
  19. }
  20. }
  21. Consumer::Consumer()
  22. {

  23. }
  24. void Consumer::run()
  25. {
  26. for(int i=0; i<SIZE; i++)
  27. {
  28. useByte.acquire();
  29. qDebug()<<"consumer:"<<i;
  30. freeByte.release();
  31. sleep(2);
  32. }
  33. }


3、条件变量

  1. #ifndef THREAD_H
  2. #define THREAD_H

  3. #include<QThread>

  4. class Producer : public QThread
  5. {
  6. Q_OBJECT
  7. public:
  8. Producer();
  9. protected:
  10. void run();
  11. };

  12. class Consumer : public QThread
  13. {
  14. Q_OBJECT
  15. public:
  16. Consumer();
  17. protected:
  18. void run();
  19. };

  20. #endif

  1. #include "thread.h"
  2. #include <QDebug>
  3. #include <QMutex>
  4. #include <QWaitCondition>

  5. QMutex mutex;
  6. QWaitCondition empty, full;
  7. int num=0;
  8. int buffer[50];
  9. int useByte=0;


  10. Producer::Producer()
  11. {

  12. }
  13. void Producer::run()
  14. {
  15. for(int i=0; i<50; i++)
  16. {
  17. mutex.lock();
  18. if(useByte==50)
  19. empty.wait(&mutex);
  20. num++;
  21. buffer[i] = num;
  22. qDebug()<<"producer:"<<num;
  23. useByte++;
  24. full.wakeAll();
    <
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • android 多线程断点续传视频列表
  • 多线程中使用curl致coredump问题
  • 安卓多线程间通信和多进程之间通信有什么不同?分别怎么实现?,安卓多线程
  • Java多线程常见问题,java多线程
  • 转载 Android 多线程处理之多线程用法大集合,android大集合
  • 为什么在python里推荐使用多进程而不是多线程?--转同事的一篇文章
  • android --多线程下载过程分析
  • Android--线程详解
  • android关于线程的那些事,android那些事
  • Android线程操作对象AsyncTask线程机制

相关文章

  • 2017-05-26Android面试题(3),android面试题
  • 2017-05-26Android 如何本地加载pdf文件,android加载pdf
  • 2017-05-26Android--split()分割字符串特殊用法,csplit字符串分割
  • 2017-05-26使用AIDL调用远程服务设置系统时间,aidl调用系统
  • 2017-05-26编译器开发系列--Ocelot语言3.类型名称的消解,编译器--ocelot
  • 2017-05-26Android自定义下拉刷新动画--仿百度外卖下拉刷新
  • 2017-05-26Android SharedPreferences存储,sharedpreferences
  • 2017-05-26Winform突然不响应KeyEvent了
  • 2017-05-26Linux内核系列—操作系统开发之进入32位保护模式,linux保护模式
  • 2017-05-26如何写一个简易的文件系统(4):umount

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android中的 Multiple dex files define 编译错误引发的思考
    • Android数据存储方式--SharedPreferences,sharedpreferences
    • arcgis andriod 加载影像,arcgisandriod
    • 减少Building &#39;Xxx&#39; Gradle project info等待时间,buildinggradle
    • Android中Handler使用浅析,androidhandler
    • 【android开发笔记】为Button的背景图片添加边框式样式效果,
    • Android之SQLite数据存储,androidsqlite
    • 硅谷商城3--购物车数据存储器,3--购物车
    • Neo4j入门点滴(一):Cypher
    • zoom动画,实现图片点击预览效果,zoom预览

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有