Qt多线程实现思路二
- 建立一个继承于Qobject的类myThread
- 在类myThread中定义线程处理函数不必是思路一里的run();
- 在窗口类中开辟一个自定义线程myThread的指针对象myT = new myThread;
- thread = new QThread(this); //创建QThread类子线程
- myT->moveToThread(thread); 把自定义线程加入到子线程中
- 自定义线程中的线程任务就可以按照线程执行
- 这样建立的线程只能通过信号和槽的方式来调用
- 一般将任务写在while()里面,在线程退出时,会等待线程任务结束再退出
- 线程处理函数内部,不允许操作图形界面
- mythread.h文件
- #ifndef MYTHREAD_H
- #define MYTHREAD_H
- #include <QThread>
- class myThread : public QObject
- {
- Q_OBJECT
- public:
- explicit myThread(QObject *parent = );
- //线程处理函数
- void myTimeout();
- void setFlag(bool flag = true);
- signals:
- void mySignal();
- public slots:
- private:
- bool isStop;
- };
- #endif // MYTHREAD_H
- mythread.cpp文件
- #include "mythread.h"
- #include <QThread>
- #include <QDebug>
- myThread::myThread(QObject *parent) : QObject(parent)
- {
- isStop = false;
- }
- void myThread::myTimeout()
- {
- while( !isStop )
- {
- QThread::sleep();
- emit mySignal();
- qDebug() << "子线程号:" << QThread::currentThread();
- if(isStop)
- {
- break;
- }
- }
- }
- void myThread::setFlag(bool flag)
- {
- isStop = flag;
- }
- widget.h文件
- #ifndef WIDGET_H
- #define WIDGET_H
- #include "mythread.h"
- #include <QWidget>
- #include <QTimer>
- #include <QThread>
- #include <QDebug>
- namespace Ui {
- class Widget;
- }
- class Widget : public QWidget
- {
- Q_OBJECT
- public:
- explicit Widget(QWidget *parent = );
- ~Widget();
- void dealSignal();
- void dealClose();
- signals:
- void startThread(); //启动子线程的信号
- private slots:
- void on_start_clicked();
- void on_stop_clicked();
- private:
- Ui::Widget *ui;
- myThread *myT;
- QThread *thread;
- };
- #endif // WIDGET_H
- widget.cpp文件
- #include "widget.h"
- #include "ui_widget.h"
- #include "mythread.h"
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- myT = new myThread;//不能初始化指定父类myThread(this)
- //创建子线程
- thread = new QThread(this);
- //把自定义线程加入到子线程中
- myT->moveToThread(thread);
- connect(myT, &myThread::mySignal, this, &Widget::dealSignal);
- qDebug() << "主线程号:" << QThread::currentThread();
- connect(this, &Widget::startThread, myT, &myThread::myTimeout);
- //窗口关闭时调用线程关闭,前提是线程要运行完当前任务
- connect(this, &Widget::destroyed, this, &Widget::dealClose);
- }
- Widget::~Widget()
- {
- delete ui;
- }
- void Widget::dealClose()
- {
- on_stop_clicked();
- delete myT;
- }
- void Widget::dealSignal()
- {
- static int i = ;
- i++;
- ui->lcdNumber->display(i);
- }
- void Widget::on_start_clicked()
- {
- if(thread->isRunning() == true)
- {
- return;
- }
- //启动线程,但是没有启动线程处理函数
- thread->start();
- myT->setFlag(false);
- //不能直接调用线程处理函数,
- //直接调用,导致,线程处理函数和主线程是在同一个线程
- //只能通过 signal - slot 方式调用
- emit startThread();
- }
- void Widget::on_stop_clicked()
- {
- if(thread->isRunning() == false)
- {
- return;
- }
- myT->setFlag(true);
- thread->quit();
- thread->wait();
- }
Qt多线程实现思路二的更多相关文章
- Qt多线程实现思路一
实现一个线程开启时,时间计时器任然能够计数,两路独立工作的线程功能.从类的帮助文件中可以看到如下信息,静态公共成员函数和保护类型的函数,在静态函数中有睡眠函数msleep毫秒级,sleep秒级,usl ...
- 【QT】 Qt多线程的“那些事”
目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...
- Qt 多线程和网络编程学习
一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...
- 【转】Lua coroutine 不一样的多线程编程思路
Lua coroutine 不一样的多线程编程思路 Sunday, Apr 26th, 2009 by Tim | Tags: coroutine, Lua 上周末开始看<Lua程序设计> ...
- Android多线程分析之二:Thread的实现
Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多线程分析之一 ...
- [转] Qt 多线程学习
Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...
- QT多线程笔记
1.QT多线程涉及到主线程和子线程之间交互大量数据的时候,使用QThread并不方便,因为run()函数本身不能接受任何参数,因此只能通过信号和槽的交互来获取数据,如果只是单方面简单交互数据还过得去, ...
- java 并发多线程 锁的分类概念介绍 多线程下篇(二)
接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概念,也是一种简单粗暴的解决方案 抗战电影中,经常出现为了阻止日 ...
- 多线程开发之二 NSOperation
效果如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UITableViewControll ...
随机推荐
- ansible hosts配置
编辑/etc/ansible/hosts 添加本机的public SSH key到目标机器的authorized_keys #ssh-copy-id 添加本机的私钥到Ansible 运行ansib ...
- Nginx + Linux 性能调优
Nginx以高性能负载均衡.缓存和web服务器出名,支撑着世界上繁忙网站中的40%.大多数使用场景下,Nginx和Linux系统的默认配置表现较好,但是仍有必要做一些调优以期达到最佳性能. 这篇文章讨 ...
- 软件bug描述(android)
1.bug主题:主要操作+bug主题 主题要简单明了,即开发一看主题就知道该问题. 2.描述: 作用:便于开发重现和定位缺陷的 2.1前置条件 2.2操作步骤 2.3预期结果 2.4实际结果 2.5备 ...
- NOIP2012-------跳石头(C语言)
#include<stdio.h> ]; int check(long mid, long n, long m) { long last, i, ans; last = a[]; ans ...
- 数据分析之pandas库--series对象
1.Series属性及方法 Series是Pandas中最基本的对象,Series类似一种一维数组. 1.生成对象.创建索引并赋值. s1=pd.Series() 2.查看索引和值. s1=Serie ...
- 国内jenkins搭建不再龟速的方式
最新国内jenkisn搭建过程 第一步下载jenkins 点击进入清华源jenkins下载地址,我们下载的是jenkins-2.204.2.zip版本 之后解压后安装. 第二步配置管理员密码 自动弹出 ...
- WannaMine4.0查杀方法
病毒现象 扫描爆破内网基于445端口的SMB服务 服务器出现卡顿.蓝屏 服务器主动访问恶意域名:totonm.com.cake.pilutce.com:443 病毒处置 删除关键病毒文件:C:\Win ...
- Python面试(网编+数据库)
第一部分 必答题 简述 OSI 7层模型及其作用?(2分) 应用层:与用户直接交互,软件.网站等 表示层:使用软件.网站可以查看的数据,图片等 会话层:保持登录状态,电脑中为cookie 传输层:选择 ...
- 00.ES6简介
ES6 简介 ECMAScript 和 JavaScript 的关系 JavaScript是由ECMAScript组织维护的,ES6的名字就取自ECMAScript中的E和S,6的意思是已经发布到第6 ...
- 伪造TGT黄金票据
通过上一篇文章我们初步了解了Kerberos协议的工作过程,解决的两个问题 第一个问题:如何证明你本人是XXX用户的问题 由Authentication Server负责 第二个问题:提供服务的服 ...