QThread线程的运行和退出

2023-11-10

关于QT退出线程,一直迷迷糊糊的,凑活着能用就行,出了问题总觉得莫名其妙,现在静下心来总结一下。

感谢

QThread的用法:开启与退出

Qt QThread 这是我 见过解析最全面的一片文章

 

线程运行有两种方式

#include <QObject>
#include <QThread>
#include <QDebug>
#include <QTimer>
#include <QLoggingCategory>

/* Qt的线程可以多次启用 
     
   这是第一种方式,使用 QObject::MoveToThread()
    1.创建你的工作类 Worker,必须继承于 QObject
    2.创建你的执行类 Controller,类内声明 QThread变量thread
    3.在Controller内将 Worker执行 MoveToThread(QThread* thd)
    4.在Controller内connect其他信号到运行函数(我的是work())。运行函数内如果是死循环,则需要自己加退出标志,然后通过其他函数操作这个变量,使死循环退出。
    5.启动 (我的 Controller ::Start() )
    6.需要时停止 (我的 Controller::Stop )
*/

class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr)  : QObject(parent) {}
    bool quit = false;
    int index = 0;
    void work()
    {
        index = 0;
        while (!quit) {
            index++;
            qDebug() << "i'm working " << index;
            QThread::msleep(500);
        }
        qDebug() << "worker:" << QThread::currentThread();
        quit = false;
    }
};


class Controller : public QObject
{
    Q_OBJECT
public:
    explicit Controller(QObject *parent = nullptr)  : QObject(parent)
    {
        worker.moveToThread(&thread);
        connect(this, &Controller::sig_Started, &worker, &Worker::work);
    }
    virtual ~Controller() {}

    Worker worker;
    QThread thread;


    void Start()
    {
        //线程函数启动,不能在此直接调用worker.work(),需要有connect连接一下才能将该函数放到线程之内运行
        thread.start();
        emit sig_Started();
    }
    void Stop(){
        qDebug() << "ready to exit";
        worker.quit = true;
        thread.wait();
        qDebug() << "exit done";
    }

signals:
    void sig_Started();
};


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "thread is "  << QThread::currentThread();

    Controller ctl;
    ctl.move2thd();
    ctl.Start();


    //10s后退出
    QThread::sleep(10);
    qDebug() << "main call thread quit";
    ctl.Stop();

    //再次启动
    qDebug() << "start again";
    ctl.Start();
    //10s后退出
    QThread::sleep(15);
    qDebug() << "main call thread quit";
    ctl.Stop();


    return a.exec();
}

 

#include <QObject>
#include <QThread>
#include <QDebug>
#include <QTimer>
#include <QLoggingCategory>

/* Qt的线程可以多次启用 
    这是第二种方式 
    1.定义一个继承于 QThread的类,类内实现函数 
        void run() override;  //你的线程执行内容
    2.如果你的不是死循环,可以在 run() 内直接执行,如果是死循环,可以用上面第一种方式的 死循环+退出标志位 的方式写,也可以使用定时器的方式
    3.定时器的方式。在 run() 函数内启动定时器,这个定时器是在当前线程上启动的,而非主线程。 run() 函数的最后一行记得加上  exec(),使线程启动消息循环,这样不用自己再加退出标志变量。此时线程函数已开始执行。
    4.如果需要停止,在其他地方调用 exit() wait(),必须在上一步执行了exec(),线程才能收到 exit()

*/


class Work2 : public QThread
{
    Q_OBJECT
public:
    Work2(QObject* parent = nullptr): QThread(parent){}
    ~Work2() { ptm->deleteLater(); }

    int index = 0;
    void tmot()
    {
        index++;
        qDebug() << "thread is " << QThread::currentThread();
        qDebug() << "i'm working " << index;
    }
    QTimer* ptm = nullptr;
    void run() override
    {
        index = 0;
        ptm = new QTimer();
        bool res = connect(ptm, &QTimer::timeout, this, &Work2::tmot, Qt::DirectConnection);
        ptm->start(500);
        exec();
    }
};


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "thread is "  << QThread::currentThread();

    Work2 work2;
    work2.start();

    //10s后退出
    QThread::sleep(10);
    qDebug() << "main call thread quit";
    work2.exit();
    work2.wait();

    //再次启动
    qDebug() << "start again";
    work2.start();
    //10s后退出
    QThread::sleep(15);
    qDebug() << "main call thread quit";
    work2.exit();
    work2.wait();


    return a.exec();
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QThread线程的运行和退出 的相关文章

  • 在 Maya 中正确使用 PySide QThread 以避免硬崩溃

    我正在尝试使用 QThreads 更新 Maya 内自定义工具基于 Qt 的 UI 我有一个线程执行任意方法并通过发出的信号返回结果 然后用它来更新我的 UI 这是我的自定义 QThread 类 from PySide import QtC
  • 第一次信号发射后自动断开

    我正在从文件加载网页 然后替换其中的一些 html self template web page QtWebKit QWebPage self template web page mainFrame load QtCore QUrl tem
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • QMainWindow 上的 Qt 布局

    我设计了一个QMainWindow with QtCreator s设计师 它由默认的中央小部件 aQWidget 其中包含一个QVBoxLayout以及其中的所有其他小部件 现在我想要的一切就是QVBoxLayout自动占据整个中央小部件
  • 如何在Qt 5中的paintEvent上使用mouseMoveEvent?

    我是 Qt 和 c 的新手 所以我遇到了一些困难 我正在尝试创建一个小部件 它可以获取 mouseMoveEvent 位置并在鼠标位置的像素图上绘制椭圆 下面你可以看到代码 include myimage h include
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • Qt 5.1.1 与 Visual Studio 2012 - 这些 QT 版本无法访问

    打开 Visual Studio 时出现此错误 我安装自http qt project org downloads http qt project org downloads 适用于 Windows 64 位的 Qt 5 1 1 VS 20
  • 如何将自定义 Qt 类型与 QML 信号一起使用?

    我在 Qt 5 2 qml 应用程序中创建了一个自定义类型 class Setting public QObject Q OBJECT Q PROPERTY QString key READ key WRITE setKey Q PROPE
  • 如何在Android中使用QML - QWebView

    我想在 Android 中部署一个 YouTube 应用程序 但它只能在我的电脑上运行 在安卓上不起作用 它不加载任何视频 问题仅出在 QWebView 上 我使用了与此类似的代码 http doc qt io archives qt 5
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • 为什么 QT 设计器重新调整大小或不允许我缩小或展开小部件或按钮?

    很多时候 在使用 QT 设计器时 我发现自己需要通过缩小或扩展来调整事物的大小 每当我尝试这样做时 程序都不允许我这样做 而只是恢复到将对象放置在窗口中时给我的原始默认大小 无论我的布局如何 为什么要这样做 是否有可能改变这一点 以便我可以
  • 如何向 PyQt5 GUI 添加线程?

    所以我使用 QT Designer 创建了一个 GUI 它工作得很好 但在更复杂的调用中 它不会更新主窗口并锁定 我想运行我的CustomComplexFunction 在根据不断变化的后端信息更新主窗口中的文本编辑时 我希望它每 2 秒运
  • 使用 QGraphicsScene 和 QGraphicsView 在 Qt 中开始基于 Tile 的游戏

    我将开始在 Qt 中编写基于 2D 图块的游戏 并阅读 QGraphicsScene 和 QGraphicsView 类 这些类旨在显示和处理大量 2D 对象 我的问题是 使用 QGraphicsScene 创建一个包含大量图块的世界是否可
  • Qt:将数字转换为 QString、QVariant 或 QString::number 哪个更好

    我只是好奇 比方说 我需要在控制台中输出一个数字 代码是 include
  • 使用 C++ 访问 Azure blob 存储 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 qbs 构建 qt 应用程序

    我想知道在 Linux 上使用 qbs 编译 构建和创建 Android Qt 应用程序的步骤 我拥有所有必要的工具 目前我可以使用 qmake 创建 apk Qbs 目前不支持构建 Qt Android 应用程序 Qbs v1 4 中引入

随机推荐

  • 如何在Jupyter Notebook中自由切换conda虚拟环境pythtorch_gpu

    一般情况 jupyter note在启动时 是与conda的默认虚拟环境 base root 连接 不能和新建虚拟环境pytorch gpu相连接 这需要安装一些插件来建立连接 需要安装的插件及过程 1 首先在conda中激活虚拟环境pyt
  • WDA学习笔记(一)环境准备

    前言 WDA目前在ABAP市场上有一定的需求 例如万科恒大碧桂园这些地产大佬们都用了一些BOPF的东西 多一个技能就多一些 机会 现在来系统了解一下WDA吧 WDA Web Dynpro For Aabap 和WDJ Web Dynpro
  • css多个class时的选择器用法

    http stackoverflow com questions 1041344 how can i select an element with multiple classes answertab active tab top 例如 a
  • dw超链接标签_Dreamweaver如何建立超链接?DW建立超链接方法介绍

    超级链接一般具有三个特点 蓝色 下划线 和手形标记 那么Dreamweaver如何建立超链接 下面小编就为大家介绍DW建立超链接方法 来看看吧 软件名称 Adobe Dreamweaver CS3 官方中文安装版软件大小 76 2MB更新时
  • 控制 matplotlib 子图大小

    效果图 代码 import numpy as np import matplotlib pyplot as plt 调整 matplotlib 子图的大小 x1 np linspace 0 0 5 0 x2 np linspace 0 0
  • Flink分布式执行包括调度、通信机制、检查点

    Flink的分布式执行包括两个重要的进程 master和worker 执行Flink程序时 多个进程参与执行 即作业管理器 Job Manager 任务管理器 Task Manager 和作业客户端 Job Client Flink程序需要
  • 考研DS备考

    23考研算法复习 一 图论相关算法 1 拓扑排序 2 最小生成树 2 1 Prim算法朴素实现 2 2 最小生成树Kruskal实现 3 最短路 3 1朴素版Dijkstra 3 2Bellman ford 3 3Floyd 二 排序相关算
  • Python 快速获取文件夹中的所有文件名,并保存到txt文件中

    下面的代码可以读取文件夹中的所有文件名 并记录到txt文件中 可以应用到如深度学习制作数据集等场景中 usr bin env python encoding utf 8 import os img path images img list
  • Windows防火墙阻止了远程调试

    问题 当调试数据库里的存储过程时提示 Windows防火墙当前阻止了远程调试 当接着打开SQL Server的时候提示 远程过程调用失败 解决办法 1 当遇到远程过程调试失败
  • windows下查看GPU使用率

    进入C Program Files NVIDIA Corporation NVSMI 在此处打开cmd 输入nvidia smi 第一行Driver Version 表示驱动是385 54 第二行中 第一行表示GPU序号 名字 Persis
  • python作业题

    1 输入三个坐标表示三角形的三个顶点 计算三角形的面积 import math x1 y1 x2 y2 x3 y3 eval input x1 y1 x2 y2 x3 y3 如果不在一条直线上就构成了三角形 if x1 x2 y1 y2 x
  • GMM-HMM在语音识别中的应用

    1 语音识别系统的基本结构 2 涉及算法 3 GMM高斯混合模型 3 1高斯混合模型的基本概念 高斯混合模型是指具有如下形式的概率分布模型 p y k 1k k y k p y arrowvert theta sum k 1 k alpha
  • docker redis单例安装

    环境 windows docker desktop 版本 19 03 12 1 下载redis的docker镜像 docker pull redis 6 0 8 2 设置docker共享目录 docker中的共享目录 即能将宿主的文件同步到
  • Pandas

    文章目录 1 什么是Pandas 2 Pandas的数据结构 2 1 Series 2 1 1 Series的创建 2 1 2 Series的属性 2 2 DataFrame 2 2 1 DataFrame的创建 2 2 2 DataFra
  • 在linux上odoo搭建

    一 配置Postgresql数据库 1 安装Postgresql root runner home sg os apt get install postgresql 2 配置postgresql 拷贝 var lib postgresql
  • Centos7五步安装Docker并解决docker官方镜像无法访问问题

    根据官方文档 https docs docker com install linux docker ce centos 搭建docker 1 卸载docker旧版本 sudo yum remove docker docker client
  • C++实现——小孩分糖果问题

    include
  • el-dialog组件实现可以拖拽移动功能

    面向百度编程的小白最近遇到一个el dialog实现拖拽移动的需求 翻了翻饿了么官网发现el dialog并没有关于这一块的属性方法 所以与大家分享一下有关的方法 首先新建一个js文件 directive js文件 用于详情对话框可移动 i
  • python4行代码实现九九乘法表

    九九乘法表是python的循环嵌套 两次利用range 相乘并输出 for i in range 1 10 for j in range 1 i 1 print sx s s j i i j end print
  • QThread线程的运行和退出

    关于QT退出线程 一直迷迷糊糊的 凑活着能用就行 出了问题总觉得莫名其妙 现在静下心来总结一下 感谢 QThread的用法 开启与退出 Qt QThread 这是我 见过解析最全面的一片文章 线程运行有两种方式 include