程序运行截图如下:

这里是4个线程,对ListWidget进行输入,

使用MoveToThread,十分简单,但关闭的时候,会出现这样的提示:

造成这样的原因是:

循环还没有结束,线程就被我们关闭了。

解决方法如下:

1.重写关闭事件;

2.使用本地事件循环,先把循环退出后,再退出线程,即可,

程序源码如下:

insertlistitem.h

#ifndef INSERTLISTITEM_H
#define INSERTLISTITEM_H#include <QObject>QT_BEGIN_NAMESPACE
class QListWidget;
QT_END_NAMESPACEclass InsertListItem : public QObject
{Q_OBJECT
public:explicit InsertListItem(QListWidget *listWidget,QObject *parent = 0);void stopThread();public slots:void beginToWork();private:QListWidget *m_listWidget;bool m_runStatus;
};#endif // INSERTLISTITEM_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QThread>class InsertListItem;
class QTimer;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected:void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE;private:Ui::Widget *ui;InsertListItem *m_list[4];QThread m_thread[4];
};#endif // WIDGET_H

insertlistitem.cpp

#include "insertlistitem.h"
#include <QThread>
#include <QListWidget>
#include <QListWidgetItem>
#include <QTime>
#include <QDebug>InsertListItem::InsertListItem(QListWidget *listWidget, QObject *parent) : QObject(parent)
{m_listWidget=listWidget;m_runStatus=true;
}void InsertListItem::beginToWork()
{for(int i=0;i<1000;i++){if(!m_runStatus){break;}QString msg="ThreadId:"+QString::number((unsigned int)QThread::currentThreadId())+" "+" Time:"+QTime::currentTime().toString("HH:mm:ss");m_listWidget->insertItem(0,msg);QThread::sleep(1);}
}void InsertListItem::stopThread()
{m_runStatus=false;
}

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "insertlistitem.h"
#include <QDebug>
#include <QMessageBox>
#include <QCloseEvent>
#include <QEventLoop>
#include <QTimer>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);m_list[0]=new InsertListItem(ui->listWidget);m_list[0]->moveToThread(&m_thread[0]);m_list[1]=new InsertListItem(ui->listWidget_2);m_list[1]->moveToThread(&m_thread[1]);m_list[2]=new InsertListItem(ui->listWidget_3);m_list[2]->moveToThread(&m_thread[2]);m_list[3]=new InsertListItem(ui->listWidget_4);m_list[3]->moveToThread(&m_thread[3]);connect(&m_thread[0],SIGNAL(started()),m_list[0],SLOT(beginToWork()));m_thread[0].start();connect(&m_thread[1],SIGNAL(started()),m_list[1],SLOT(beginToWork()));m_thread[1].start();connect(&m_thread[2],SIGNAL(started()),m_list[2],SLOT(beginToWork()));m_thread[2].start();connect(&m_thread[3],SIGNAL(started()),m_list[3],SLOT(beginToWork()));m_thread[3].start();}Widget::~Widget()
{delete ui;
}void Widget::closeEvent(QCloseEvent *event)
{QMessageBox::StandardButton button=QMessageBox::information(this,"提示","退出",QMessageBox::Ok,QMessageBox::Cancel);if(button==QMessageBox::Ok){m_list[0]->stopThread();m_list[1]->stopThread();m_list[2]->stopThread();m_list[3]->stopThread();QEventLoop loop;QTimer::singleShot(1*1000,&m_thread[0],SLOT(terminate()));QTimer::singleShot(1*1000,&m_thread[1],SLOT(terminate()));QTimer::singleShot(1*1000,&m_thread[2],SLOT(terminate()));QTimer::singleShot(1*1000,&m_thread[3],SLOT(terminate()));QTimer::singleShot(1.5*1000,&loop,SLOT(quit()));QTimer::singleShot(2*1000,this,SLOT(close()));loop.exec();event->accept();}else{event->ignore();}
}

Qt工作笔记-moveToThread的基本使用以及让线程安全退出相关推荐

  1. Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包

    原理以及运行 原理是因为QJsonDocument提供了一个函数toJson 可以直接把Json数据转成QByteArray,这样就可以直接发送数据包,然后再按照常规方法解析即可,本源码中含解析内容, ...

  2. Qt文档阅读笔记-Qt工作笔记-QThread解析与实例(主线程发送信号给子线程)

    目录 QThread 官方解析 博主栗子 子线程发射信号给主线程 QThread 官方解析 Detailed Description QThread类提供了跨平台的线程管理的API. QThread对 ...

  3. C/C++|Qt工作笔记-4种方法判断当前对象(类)名或标识(继承发,typeid法,元对象className()法,Q_CLASSINFO法)

    回想起3个月前,刚刚参加工作也做过类似的笔记,但只有2种方法,估计刚毕业没有什么墨水,经过3个月时间又多了2种方法: 这些方法都可用于RTTI 第一个方法是继承发(C++中很推荐用这个,感觉用这个结构 ...

  4. Qt工作笔记-Qt5中中文编码方面的笔记

    目前在使用国内的数据库和实时库接口. 说句实话,国内的东西与国外的东西比,在用户体验和接口调用上比还是存在很大的距离. 个人喜欢用QString去存储数据.个人感觉QTL比STL开发起来要快点 这里有 ...

  5. Qt工作笔记-使用toVariant().toMap()分割Json文件(666解析法)

    目录 概念 演示过程及源码 概念 今天看到大佬去解析Json文件的代码,简直666,特意记录此笔记,方便以后用得到,肯定会用得到. 演示过程及源码 如下面的这个Json代码,这个是调用face++的h ...

  6. Qt工作笔记-在Graphics上写文本(QGraphicsSimpleTextItem与QGraphicsTextItem的基本使用)

    查了下文档发现就这2个, 一个是QGraphicsTextItem,另外一个是QGraphicsSimpleTextItem 从官方对QGraphicsTextItem中的描述中可以看到: 这个QGr ...

  7. Qt工作笔记-3D效果唤出QWidgets界面(QGraphicsProxyWidget与QTimeLine)

    程序运行截图如下: 关键点一: ->:这个箭头表示左边的类是放到右边的类里面的 QWidget->QGraphicsProxyWidget QGraphicsProxyWidget-> ...

  8. Qt工作笔记-线程池作用之一:限制系统中执行线程的数量

    一.线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量,其 ...

  9. Qt工作笔记-QHash与QMap查找速度粗略比较实战

    因为工作需要,要大量用到查找,关于查找,在Qt中比较常用的就两个,一个QHash,一个QMap, 关于谁快,谁慢,官方已经给出了答案 但我们来实战下,因为时间复杂度的多少,在真实运行情况下有的时候,差 ...

最新文章

  1. [转载] HTTP 之 IOS一谈
  2. 计算机视觉库OpenCV初步了解
  3. 解决启动Distributed Transaction Coordinator服务出错的问题
  4. 【英语学习】【English L06】U08 News L2 Have you read the news about the light show?
  5. oracle错误代码及解决办法整合
  6. C#全局钩子和局部钩子记录
  7. 【简单】Linux 搭建 UOJ
  8. ESIX群晖NAS安装教程
  9. apiDoc 详解 api接口文档生成
  10. 计算机如何将两个磁盘合在一起,win10怎么把电脑自带的两个磁盘合并到一起
  11. 计算长方体、四棱锥的表面积和体积
  12. 将 SVN Repositories 内部的下层目录,提升成为顶层 Repositories 的风险
  13. 基于vue的h5网页微信分享链接图标丢失问题解决
  14. 音乐考试分数计算机,音乐艺考分数怎么算 音乐艺考分数比例
  15. 微信公众平台开发——新增素材
  16. 基于Opencv和STM32物理鼠标的目标跟踪器
  17. linux掩码,linux文件权限掩码umask
  18. 模型预测控制系列讲解(二):模型预测控制算法发展进程
  19. Android 应用程序开发
  20. IDEA 中配置GIT环境

热门文章

  1. 北方华创:「8大报表应用场景」助力全方位数字化管理
  2. 飞秋爱好者(WZ132)
  3. 【转载】飞鸽传书2013【绿色版】
  4. 更改Web.config中对上传文件大小限制
  5. 点讯输入法S60数字键通用版V6.0(官方签名正式版)
  6. 不搞代码来搞我,我又动了谁的奶酪?
  7. 第五节:简单又强大的数据类型:any任意值
  8. css实用技巧:巧用css实现两栏等高布局
  9. mysql哪些字段适合索引_(转)Mysql哪些字段适合建立索引
  10. 图像处理方面的sci期刊_【IEEE Access 】【一年收录1.5w篇文章的SCI】一个月录用案例...