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();
}

最新文章

  1. JDBC API Description
  2. c# 远程连接ORACLE数据库
  3. 【python】用setup安装自定义模块和包
  4. Oracle11g在使用exp导出时不导出空表问题的解决办法
  5. PAIP.MYSQL SLEEP 连接太多解决
  6. 针对局域网IM飞秋(feiq)的开发总结
  7. nyoj 129 树的判定
  8. 三个PHP常用代码样例
  9. C++中弱符号(弱引用)的意义及实例
  10. java 空指针异常造成的原因有哪些
  11. Java基础----jdk1.8 反射实验
  12. ●BOZJ 2127 happiness
  13. oldboy s21day13装饰器和推导式
  14. 18.22 sprintf函数功能
  15. 2018-2019-2 20165205 《网络对抗技术》 Exp6 信息收集与漏洞扫描
  16. python常用库之random
  17. Gym 101972
  18. lua脚本之lua语言简介以及lua的安装
  19. 安卓程序代写 网上程序代写[原]Android开发技巧--Application
  20. centos6.4安装GCC

热门文章

  1. malloc返回地址的对齐问题
  2. 为什么Linux 实例执行 df 和 du 查看磁盘时结果不一致
  3. centos6.5和centos7.5统一字符集为zh_CN.UTF-8解决系统和MySQL数据库乱码问题
  4. Unity 编辑器开发SceneView GUI控制
  5. window.location操作url对象
  6. 全志V3S 编译运行xboot笔记
  7. [CQOI2015]选数(莫比乌斯反演,杜教筛)
  8. hadoop学习摘要
  9. 常用 PostgreSQL 脚本
  10. iMacros 入门教程-基础函数介绍(2)