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. 线程处理函数内部,不允许操作图形界面

  • 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多线程实现思路二的更多相关文章

  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. nginx单个ip访问频率限制

    一.限制所有单个ip的访问频率 1.http中的配置 http { #$limit_conn_zone:限制并发连接数 limit_conn_zone $binary_remote_addr zone ...

  2. JS对象与字符串相互转换

    1. JSON.stringify( )---对象转为JSON字符串(前端向后端传递数据时使用) const obj = { id: 0, name: '张三', age: 12 } const ob ...

  3. 标准 I/O 和管道

    1.标准输入和输出1>程序:指令+数据(指令服务于数据) 读入数据:input 输出数据:output 2>三种 I/O 设备 Linux 给程序提供三种 I/O 设备 标准输入(STDI ...

  4. 在Kali linux下使用docker配置sqli-labs(国内源的配置和系统软件更新)

    本篇blog导航: ~前言 ~第一步:在安装好的kali配置国内源 ~第二步:安装docker ~第三步:docker下安装sqli-labs ~写在最后. 前言: 最近闲来无事,在闯关sqli-la ...

  5. SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  6. go实现java虚拟机01

    前段时间看了一本书,说的是用go语言实现java虚拟机,很有意思,于是就花了一段时间学习了一下go语言,虽然对go的底层理解不是很深,但是写代码还是可以的,就当做个读书笔记吧! 链接在这里,另外还有一 ...

  7. 有哪些「看似复杂,实则简单」的 PS 技巧?

    Mac版ps2019哪里有?本次主要以组合键为主,PS中隐藏功能都是通过这些“组合技”启动的,据统计熟练地使用一系列组合技会让你的效率提升30%(纯属虚构).其中一些比较难理解的我都制作了GIF动态图 ...

  8. CentOS7安装MySQL报错,解决Failed to start mysqld.service: Unit not found

    当输入命令 ~]# systemctl start mysql.service 要启动MySQL数据库是却是这样的提示 Failed to start mysqld.service: Unit not ...

  9. 数据分析----天气预报走向(pygal)

    #!usr/bin/env python #-*- coding:utf-8 _*- """ @author:Administrator @file: 可视化天气预报.p ...

  10. Python爬虫连载3-Post解析、Request类

    一.访问网络的两种方法 1.get:利用参数给服务器传递信息:参数为dict,然后parse解码 2.post:一般向服务器传递参数使用:post是把信息自动加密处理:如果想要使用post信息,需要使 ...