1. 建立一个继承于Qobject的类myThread
  2. 在类myThread中定义线程处理函数不必是思路一里的run();
  3. 在窗口类中开辟一个自定义线程myThread的指针对象myT = new myThread;
  4. thread = new QThread(this); //创建QThread类子线程
  5. myT->moveToThread(thread); 把自定义线程加入到子线程中
  6. 自定义线程中的线程任务就可以按照线程执行
  7. 这样建立的线程只能通过信号和槽的方式来调用
  8. 一般将任务写在while()里面,在线程退出时,会等待线程任务结束再退出
  9. 线程处理函数内部,不允许操作图形界面

    1. mythread.h文件
  1. #ifndef MYTHREAD_H
  2. #define MYTHREAD_H
  3. #include <QThread>
  4.  
  5. class myThread : public QObject
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit myThread(QObject *parent = );
  10. //线程处理函数
  11. void myTimeout();
  12.  
  13. void setFlag(bool flag = true);
  14.  
  15. signals:
  16. void mySignal();
  17.  
  18. public slots:
  19.  
  20. private:
  21. bool isStop;
  22. };
  23.  
  24. #endif // MYTHREAD_H
  • mythread.cpp文件
  1. #include "mythread.h"
  2. #include <QThread>
  3. #include <QDebug>
  4.  
  5. myThread::myThread(QObject *parent) : QObject(parent)
  6. {
  7. isStop = false;
  8. }
  9.  
  10. void myThread::myTimeout()
  11. {
  12. while( !isStop )
  13. {
  14.  
  15. QThread::sleep();
  16. emit mySignal();
  17.  
  18. qDebug() << "子线程号:" << QThread::currentThread();
  19.  
  20. if(isStop)
  21. {
  22. break;
  23. }
  24. }
  25. }
  26.  
  27. void myThread::setFlag(bool flag)
  28. {
  29. isStop = flag;
  30. }
  • widget.h文件
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include "mythread.h"
  4. #include <QWidget>
  5. #include <QTimer>
  6. #include <QThread>
  7. #include <QDebug>
  8. namespace Ui {
  9. class Widget;
  10. }
  11.  
  12. class Widget : public QWidget
  13. {
  14. Q_OBJECT
  15.  
  16. public:
  17. explicit Widget(QWidget *parent = );
  18. ~Widget();
  19. void dealSignal();
  20. void dealClose();
  21.  
  22. signals:
  23. void startThread(); //启动子线程的信号
  24.  
  25. private slots:
  26.  
  27. void on_start_clicked();
  28.  
  29. void on_stop_clicked();
  30.  
  31. private:
  32. Ui::Widget *ui;
  33. myThread *myT;
  34. QThread *thread;
  35. };
  36.  
  37. #endif // WIDGET_H
  • widget.cpp文件
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include "mythread.h"
  4. Widget::Widget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::Widget)
  7. {
  8. ui->setupUi(this);
  9. myT = new myThread;//不能初始化指定父类myThread(this)
  10.  
  11. //创建子线程
  12. thread = new QThread(this);
  13.  
  14. //把自定义线程加入到子线程中
  15. myT->moveToThread(thread);
  16.  
  17. connect(myT, &myThread::mySignal, this, &Widget::dealSignal);
  18.  
  19. qDebug() << "主线程号:" << QThread::currentThread();
  20.  
  21. connect(this, &Widget::startThread, myT, &myThread::myTimeout);
  22.  
  23. //窗口关闭时调用线程关闭,前提是线程要运行完当前任务
  24. connect(this, &Widget::destroyed, this, &Widget::dealClose);
  25.  
  26. }
  27.  
  28. Widget::~Widget()
  29. {
  30. delete ui;
  31. }
  32.  
  33. void Widget::dealClose()
  34. {
  35. on_stop_clicked();
  36. delete myT;
  37. }
  38.  
  39. void Widget::dealSignal()
  40. {
  41. static int i = ;
  42. i++;
  43. ui->lcdNumber->display(i);
  44. }
  45.  
  46. void Widget::on_start_clicked()
  47. {
  48. if(thread->isRunning() == true)
  49. {
  50. return;
  51. }
  52.  
  53. //启动线程,但是没有启动线程处理函数
  54. thread->start();
  55. myT->setFlag(false);
  56.  
  57. //不能直接调用线程处理函数,
  58. //直接调用,导致,线程处理函数和主线程是在同一个线程
  59. //只能通过 signal - slot 方式调用
  60. emit startThread();
  61. }
  62.  
  63. void Widget::on_stop_clicked()
  64. {
  65. if(thread->isRunning() == false)
  66. {
  67. return;
  68. }
  69.  
  70. myT->setFlag(true);
  71. thread->quit();
  72. thread->wait();
  73. }

Qt多线程实现思路二的更多相关文章

  1. Qt多线程实现思路一

    实现一个线程开启时,时间计时器任然能够计数,两路独立工作的线程功能.从类的帮助文件中可以看到如下信息,静态公共成员函数和保护类型的函数,在静态函数中有睡眠函数msleep毫秒级,sleep秒级,usl ...

  2. 【QT】 Qt多线程的“那些事”

    目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...

  3. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  4. 【转】Lua coroutine 不一样的多线程编程思路

    Lua coroutine 不一样的多线程编程思路 Sunday, Apr 26th, 2009 by Tim | Tags: coroutine, Lua 上周末开始看<Lua程序设计> ...

  5. Android多线程分析之二:Thread的实现

    Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处   在前文<Android多线程分析之一 ...

  6. [转] Qt 多线程学习

    Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...

  7. QT多线程笔记

    1.QT多线程涉及到主线程和子线程之间交互大量数据的时候,使用QThread并不方便,因为run()函数本身不能接受任何参数,因此只能通过信号和槽的交互来获取数据,如果只是单方面简单交互数据还过得去, ...

  8. java 并发多线程 锁的分类概念介绍 多线程下篇(二)

    接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...

  9. 多线程开发之二 NSOperation

    效果如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UITableViewControll ...

随机推荐

  1. ansible hosts配置

    编辑/etc/ansible/hosts 添加本机的public SSH key到目标机器的authorized_keys   #ssh-copy-id 添加本机的私钥到Ansible 运行ansib ...

  2. Nginx + Linux 性能调优

    Nginx以高性能负载均衡.缓存和web服务器出名,支撑着世界上繁忙网站中的40%.大多数使用场景下,Nginx和Linux系统的默认配置表现较好,但是仍有必要做一些调优以期达到最佳性能. 这篇文章讨 ...

  3. 软件bug描述(android)

    1.bug主题:主要操作+bug主题 主题要简单明了,即开发一看主题就知道该问题. 2.描述: 作用:便于开发重现和定位缺陷的 2.1前置条件 2.2操作步骤 2.3预期结果 2.4实际结果 2.5备 ...

  4. NOIP2012-------跳石头(C语言)

    #include<stdio.h> ]; int check(long mid, long n, long m) { long last, i, ans; last = a[]; ans ...

  5. 数据分析之pandas库--series对象

    1.Series属性及方法 Series是Pandas中最基本的对象,Series类似一种一维数组. 1.生成对象.创建索引并赋值. s1=pd.Series() 2.查看索引和值. s1=Serie ...

  6. 国内jenkins搭建不再龟速的方式

    最新国内jenkisn搭建过程 第一步下载jenkins 点击进入清华源jenkins下载地址,我们下载的是jenkins-2.204.2.zip版本 之后解压后安装. 第二步配置管理员密码 自动弹出 ...

  7. WannaMine4.0查杀方法

    病毒现象 扫描爆破内网基于445端口的SMB服务 服务器出现卡顿.蓝屏 服务器主动访问恶意域名:totonm.com.cake.pilutce.com:443 病毒处置 删除关键病毒文件:C:\Win ...

  8. Python面试(网编+数据库)

    第一部分 必答题 简述 OSI 7层模型及其作用?(2分) 应用层:与用户直接交互,软件.网站等 表示层:使用软件.网站可以查看的数据,图片等 会话层:保持登录状态,电脑中为cookie 传输层:选择 ...

  9. 00.ES6简介

    ES6 简介 ECMAScript 和 JavaScript 的关系 JavaScript是由ECMAScript组织维护的,ES6的名字就取自ECMAScript中的E和S,6的意思是已经发布到第6 ...

  10. 伪造TGT黄金票据

    通过上一篇文章我们初步了解了Kerberos协议的工作过程,解决的两个问题 第一个问题:如何证明你本人是XXX用户的问题   由Authentication Server负责 第二个问题:提供服务的服 ...