Qt中主线程如何不优雅地结束掉一个被卡死的子线程

2023-11-09

前提

这里所说的子线程其实是一个类,使用如下代码让其实例化对象运行在单独的线程中。例如是一个class A,如下代码中m_thread是在.h文件里声明,其余代码是在A的构造函数中。

QThread m_thread;
this->moveToThread(&m_thread);
m_thread.start();

我们在主线程中构建了一个A的对象,在class A中执行了某个操作,如果参数不对,其中某个函数会一直阻塞,不像现在网上大部分说的while循环加一标志位来结束阻塞那么简单。我也试过使用terminate()但是好像没用,软件退出后,那个线程仍然没用结束掉。

解决办法

其实也比较简单,在主线程中调用delete A(这里A是class A new出来的一个对象),然后在calss A的析构函数里执行如下代码:

    m_thread.requestInterruption();
    m_thread.quit();
    //m_thread.wait();

requestInterruption()按照字面意思是请求中断,这样就可以从阻塞的地方暂时跑出来,然后执行quit来结束这个线程。注意,不要在后面使用wait(),这样的话也会再次被阻塞。
这样的话,在程序退出时,虽然会提示程序异常结束,但是那个阻塞的子线程的确也结束掉了。所以,我将该方法命名为不优雅退出阻塞线程法。

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

Qt中主线程如何不优雅地结束掉一个被卡死的子线程 的相关文章

  • 将 UTC 格式的 QDateTime 转换为本地系统时间

    我从这样的字符串构造 QDateTime QDateTime date QDateTime fromString 2010 10 25T10 28 58 570Z yyyy MM ddTHH mm ss zzzZ 我知道date是 UTC
  • QWidget::showMinimized() 不起作用

    在 Ubuntu 13 04 上 如果使用QWidget showMinimized 为了最小化窗口 我发现通过单击系统任务栏上的应用程序图标恢复它后 调用QWidget showMinimized 无法工作 connect minimum
  • 使用嵌入qt的mysql?

    我正在尝试使用嵌入 QT 的 mysql 我已经有一个与 mysqld 链接的 Qt mysql 插件 该插件可以很好地加载嵌入式数据库 但 QT 没有简单的方法来设置 dataDir 等嵌入式选项 我在这里看到 http doc qt i
  • QWinTaskbarProgress 不会显示

    我使用的是windows7和Qt5 3 0 我在 MainWindow 的构造函数中添加了以下内容 但任务栏上没有显示任何内容 我错过了什么 QWinTaskbarProgress pTaskbarProgress new QWinTask
  • 包含 Qt 标头的正确方法是什么?

    到目前为止我知道几种方法 includeQt 类 include
  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • 如何在不同的QT线程中创建一个窗口?

    我有一个应用程序 其中每个线程 主线程除外 都需要创建自己的窗口 我尝试创建一个线程然后调用this gt exec in the run功能 然而 在我接到那个电话之前我就收到了一个错误 ASSERT failure in QWidget
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt
  • 如何在Qt3D中优化点云渲染

    我正在尝试使用 Qt3D 显示大型点云 20M pts 我第一次发现这个图书馆https github com MASKOR Qt3DPointcloudRenderer https github com MASKOR Qt3DPointc
  • 如何使用 qt 库中的调试符号为 qt 5.5 创建开发 shell

    我有一个开发外壳buildInputs条目包括qt55 qtbase 这很好用 今天 我在 qt 库中发生了段错误 我想要带有调试符号的 qt 库 我看了一下nixpkgs pkgs development libraries qt 5 5
  • 在 Windows 上以 QML 播放 RTSP 视频

    我正在尝试将 QML 中的 RTSP 流播放到视频标签中 如下所示 Repeater model 8 Video Layout fillWidth true Layout fillHeight true fillMode VideoOutp
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • 如何使用bind将成员函数作为函数指针传递?

    我试图将成员函数作为函数指针传递 这样我就不需要依赖单例或全局函数来处理 Qt 5 中的 Qt 消息 据我所知 我的 std function 是正确的类型 它具有正确的签名 并且绑定应该允许我插入隐式this指针 本质上是将成员函数传递为
  • QGraphicsSimpleTextItem“无效使用不完整类型”

    我的代码如下 指针部件 h QGraphicsSimpleTextItem text 指针控件 cpp void PointerWidget placeNumbers float spacing int currentTickNumber
  • 在另一个中使用 QAbstractListModel

    我在尝试使用 Qt QML 为我的应用程序开发数据模型时遇到问题 我已经用过一个QAbstractListModel能够将海关数据模型从 C 传递到 QML 并且它对于简单模型 例如基于字符串和布尔的模型 来说就像一个魅力 但现在我需要建立
  • 我如何告诉 QTableWidget 结束编辑单元格?

    我正在显示一个弹出菜单来选择 QTableWidget 中的某些值 最下面的项目是 修改列表 条目 当我选择它时 应自动出现一个新窗口 并且 QComboBox 应消失 并且单元格返回到 Qt DisplayRole 状态 现在 Qt 拥有
  • Qt - 意外的 GDB 退出

    我正在尝试开发一个应用程序 该应用程序创建图像并使用双线性插值填充颜色像素 然后显示它 到目前为止我的代码如下 include
  • Qt:关闭期间线程仍在运行时 qthread 被销毁

    我有一堂课 class centralDataPool public QObject Q OBJECT public centralDataPool QObject parent 0 centralDataPool commMonitor
  • 如何阻止 Qt Creator 将可执行文件放置在“调试”子目录中?

    我正在 Qt Creator 中构建一个项目 虽然我不关心中间 obj 文件去哪里 但重要的是最终的可执行文件应放入 并运行 许多依赖项 DLL 等所在的特定目录中 被发现 因此 在 Qt Creator 中 我选择 Shadow Buil

随机推荐

  • SQL 快速插入数据 1000万条数据

    insert into 表名 select generate series 0 10000000 md5 random text clock timestamp
  • Unity内实现高级相机效果

    Cinemachine插件可以快速实现各种相机效果 例如跟随 分镜 推拉式镜头等 配合Timeline可以创建Cinemachine Track实现动画融合 从PackageManager上可以下载Cinemachine插件 它有以下几种类
  • Linux Bash单方括号与双方括号 [和[[的区别

    本文参考 Burak G kmen 的文章 Differences Between Single and Double Brackets in Bash 单括号 是 shell builtin 即 test 内置命令 type is a s
  • Spring boot Shiro anno不启作用问题分析

    1 分析 之前在Shiro中没有配置过静态资源过滤 这次在配置过程中给予静态资源anno发现还是会被拦截 查阅其它博客 基本上都是在说LinkedHashMap 过滤次序问题 但我最初就是这个 因此排除 后再翻阅相关博客的时候看到了 大佬博
  • 输出杨辉三角形(要求输出10行)

    include
  • Python 教程之 Pandas(14)—— 使用 Pandas 进行数据分析

    Pandas是最流行的用于数据分析的 Python 库 它提供高度优化的性能 后端源代码完全用C或Python编写 我们可以通过以下方式分析 pandas 中的数据 1 Series 2 数据帧 Series Series 是 pandas
  • TypeScript总结 一【数组,联合,交叉类型】

    最近刚把ts学完 简单总结一下 ts的话 更强调类型 更加严谨 非原始类型 1 object 不包括基础数据类型 小写的 let obj object a 1 let obj object 1 2 Object 包括基础数据类型 大写的O
  • 基于ARM的自来水厂全自动恒压供水监控系统

    文末下载完整资料 随着越来越多的场合正向自动化无人职守迈进 尤其在安全 监控等领域 为了进一步降低成本 减少人力的投资 以及更集中 更方便的掌握现场情况 许多场合都采用了电子监控设备 如办公室 发电站 机场 海关等等领域 而这些电子设备的设
  • KeyEvent事件

    Java按键事件KeyEvent 按键事件可以利用键盘来控制和执行一些动作 或者从键盘上获取输入 只要按下 释放一个键或者在一个组件上敲击 就会触发按键事件 KeyEvent对象描述事件的特性 按下 放开 或者敲击一个键 和对应的值 jav
  • 解决xgboost安装问题:xgboost.core.XGBoostError: XGBoost Library (xgboost.dll) could not be loaded.

    问题描述 下载xgboost 使用pip安装后 在python中导入import xgboost出错 如下 xgboost core XGBoostError XGBoost Library xgboost dll could not be
  • 常用计算机英文缩写,常用计算机英文缩写含义

    常用计算机英文缩写含义 AAL ATM适配层 ATM Adaptation Layer ABR 可用比特率 Available Bit Rate ACR 衰减串扰比 ADPCM 自适应差分PCM ADSL 非对称数字环路 Asymmetri
  • 使用idea导入Maven项目教程

    选择导入存在的项目 指定Maven模型 修改项目设置 在使用tomcat启动项目时 可能没有servlet api包需要手动导入 如果出现jar包问题 在settings中勾选 然后重新下载jar包 在Settings设置中设置jdk信息
  • 关于遗传算法

    关于遗传算法 有很多袋鼠 它们降落到喜玛拉雅山脉的任意地方 这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰 但每过几年 就在一些海拔高度较低的地方射杀一些袋鼠 于是 不断有袋鼠死于海拔较低的地方 而越是在海拔高的袋鼠越是能活得更久 也越有机会生
  • STM32 使用STM32F103控制无源蜂鸣器发声播放音乐

    使用STM32控制无源蜂鸣器发声播放音乐 注 学习STM32总结做的笔记 大神勿喷 有不足之处还望不吝赐教 本篇大部分转载而来 有侵权请联系作者 谢谢 原博客地址 https blog csdn net fanxp66 article de
  • Vue3+TypeScript+Router+Vuex+Ant-Design-Vue项目(四)—— vue-router 基本配置

    App vue 修改 App vue 文件
  • 总结伪类与伪元素

    熟悉前端的人都会听过css的伪类与伪元素 然而大多数的人都会将这两者混淆 本文从解析伪类与伪元素的含义出发 区分这两者的区别 并且列出大部分伪类与伪元素的具体用法 即使你有用过伪类与伪元素 但里面总有一两个你没见过的吧 1 伪类与伪元素 先
  • python每日一题

    输入一个字符串 将其中的小写字母转换成大写字母 并输出转换后的结果 s input 请输入一个字符串 result for c in s if c islower result c upper else result c print 转换后
  • 路由器工作原理

    一 路由器工作原理 1 什么是路由器 路由器的定义 是实现网络互连设备 工作在网络层 路由器的功能 路由和转发 1 可以决定数据包从来源端到目的端所经过的路由路径 host到host之间的最佳传输路径 这个过程称为路由 2 将路由器输入端的
  • [Android]【安卓】Service详解

    Android 安卓 Service详解 本篇博客已收录到我的安卓开发小结中 点击 安卓开发小结 参考资料 Android总结篇系列 Android Service 第一行代码 Android总结篇系列 Android Service Se
  • Qt中主线程如何不优雅地结束掉一个被卡死的子线程

    前提 这里所说的子线程其实是一个类 使用如下代码让其实例化对象运行在单独的线程中 例如是一个class A 如下代码中m thread是在 h文件里声明 其余代码是在A的构造函数中 QThread m thread this gt move