如何停止线程 - Qthread

2024-04-18

我必须在按下两个不同的按钮时启动/停止线程。
请指出我的代码是否正确。我是否错过了 connect() 调用中的某些内容?

Problem我面临的是,在我的线程上调用 quit() 后,然后我等待我的线程完成,但在线程上调用 wait()never returns true, 和我的program is stuck in, while(!m_deviceThread.wait())

请建议如何解决这个问题?

我的设备线程和工作对象在 Mainwindow 类中定义:--

QThread m_deviceThread;
deviceThreadObject *m_deviceThreadObject;

主设备线程对象:-----

class deviceThreadObject : public QObject
{
    Q_OBJECT
public:
    explicit deviceThreadObject(QObject *parent = 0);

    /*!
      Termination control main thread
    */
    bool m_bQuit;


signals:

public slots:
    void dowork();

};

deviceThreadObject 对象构造函数:--

// constructor for the deviceThreadObject
deviceThreadObject::deviceThreadObject(QObject *parent) :
    QObject(parent)
{
    m_bQuit = false;
}

我有主线程m_deviceThread在按下开始按钮时运行:---

void MainWindow::on_actionStart_triggered()
{
    if(!b_threadAlreadyStarted)
    {

   m_deviceThreadObject = new deviceThreadObject;

    // connect device thread signal to the slot
    connect(&m_deviceThread ,SIGNAL(started()),m_deviceThreadObject,SLOT(dowork()));

    m_deviceThreadObject->moveToThread(&m_deviceThread);

    // Set the flag before starting slot of main thread
    m_deviceThreadObject->m_bQuit = true;

    m_deviceThread.start();

    }
}

我有主线程m_deviceThread按下停止按钮时停止:---

void MainWindow::on_actionStop_triggered()
{
    if(b_threadAlreadyStarted)
    {

        b_threadAlreadyStarted = false;

        // get out of event loop
        m_deviceThreadObject->m_bQuit = false;

        m_deviceThread.quit();
        qDebug() << " \n quit ";

        // wait for thread to terminate
        while(!m_deviceThread.wait());

        m_deviceThreadObject->deleteLater();

        qDebug() << " \n finished";

    }

}

// 设备-线程的公共槽

void deviceThreadObject::dowork()
{

  while(m_bquit)
  {

     // Do some work

  }

}

过去我见过几种不同的方法来做到这一点。

下面显示了编译器优化代码的样子:

bool quit = false;
while(!quit)
{
    // no reference to quit here or in any functions mentioned in here
}

可能会变成一个永远的循环。

// bool quit = false
while(true)
{
    // looks the same to the compiler...
}

迫使您了解线程同步和关键区域或互斥体或信号量的最佳实践是将退出参数的访问视为线程之间共享的变量,并将其包装起来,以便一次只能由一个线程访问。我的首选方法是使用QMutexLocker,因为它可以很好地处理范围变化,returns, breaks, etc.

http://qt-project.org/doc/qt-5.1/qtcore/qmutexlocker.html#details http://qt-project.org/doc/qt-5.1/qtcore/qmutexlocker.html#details

所以你的代码会添加如下内容:

deviceThreadObject::deviceThreadObject(QObject *parent) :
    QObject(parent)
{
    m_mutex = new QMutex();
}

void deviceThreadObject::stop()
{
    QMutexLocker locker(m_mutex);
    m_stopped = true;
}

void deviceThreadObject::doWork()
{
    m_stopped = false;
    while(true)
    {
        // The core work of your thread...

        // Check to see if we were stopped
        {
            QMutexLocker locker(m_mutex);
            if(m_stopped)
                break;
        }// locker goes out of scope and releases the mutex
    }
}

一个快速而肮脏的捷径是使用volatile bool。这不是推荐的做法,并且在跨编译器上并不可靠。

希望有帮助。

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

如何停止线程 - Qthread 的相关文章

  • 如何完全删除 QLayout 的边距(特定于 Mac OS)

    Let me explain a simplified situation In Qt Creator create a QHBoxLayout containing a QPushButton and another QHBoxLayou
  • pyqt在mac osx雪豹中安装问题

    我正在学习制作桌面应用程序的教程 使用python和qt4 我下载并安装了qt Creator ide 创建了 ui文件 然后我必须使用pyuic4对其进行转换 我已经尝试了很多东西但仍然无法做到 我以为pyuic4会用Qt Creator
  • 为什么 RangeSlider 在 QtQuick 中可用,而不是作为标准 Widget

    我需要像范围滑块 具有两个用于设置最小 最大值的手柄的滑块 之类的东西 我注意到有一个RangeSlider在 QtQuick 和 QML 无论是什么 中 但没有 标准小部件 例如QRangeSlider 为什么是这样 我可以用那个吗Ran
  • 更改 Qt 中的标签

    我正在尝试制作一个由按钮和标签组成的简单程序 当按下按钮时 它应该将标签文本更改为程序内 QString 变量中的任何内容 到目前为止 这是我的代码 这是我的 widget h 文件 class Widget public QWidget
  • QT 5.6 QWebEngine不保存cookie

    我正在创建名为 webengine 的简单 QT 应用程序 pWebView new QWebEngineView this pWebView gt load QUrl http technoz ru pWebView gt show On
  • PyQt5:如何将 QPushButton 连接到插槽?

    好吧 几乎所有教程 可理解的用人类语言编写的文档都是针对 PyQt4 的 但是 PyQt5 改变了整个 将按钮连接到插槽 的工作方式 但我仍然不知道如何做到这一点 我在 QtDesigner 中做了一个快速 gui 并且有一个 QPushB
  • 为什么我的 QGestureRecognizer 收不到触摸事件?

    上下文 我正在尝试创建一个类似推子的小部件 它可以在同一视图中具有多个实例 每个实例都可以由不同的手指同时控制 我想用Qt的手势识别系统 http qt project org doc qt 4 8 gestures overview ht
  • 由于 QCoreApplication 事件循环,QThread 永远不会退出

    Problem 所以我有一个 CommandRetriever 类来保存一些命令 并且should在不同的线程上执行这些命令 class CommandRetriever public CommandRetriever CommandRet
  • qt 读取就绪信号

    我正在尝试与运行 1996 年处理器的设备建立串行连接 这意味着数据传输回我可能需要几秒钟的时间 我知道readyRead每次有新数据可用时都会生成信号 但我的问题是生成多长时间 这也是我可以测试就绪读取是否较低的一种方法 因为如果当它们不
  • 如何使用 QWebElement 设置 input(type="file") 的值?

    我正在尝试将照片上传到vk com https vk com using QtWebKit https qt project org doc qt 4 8 qtwebkit html模块 我面临的问题是无法正确填写input type fi
  • C++ 是否可以延迟常量静态成员的初始化?

    我正在使用 Qt 但这是一个通用的 C 问题 我的情况很简单 我有一个课程Constants它有一个常量静态成员 我希望在进行某些函数调用后对其进行初始化 常量 h ifndef CONSTANTS H define CONSTANTS H
  • QMetaObject::invokeMethod 在以下情况下不起作用:

    从静态类和非主线程调用 简而言之 我有一个类 sapp 它有另一个静态类 tobj 作为静态成员 为了避免静态顺序初始化失败 tobj 在 sapp 的方法中声明 该方法又返回 tobj 实例的指针 我的问题是 tobj 有一个计时器 应该
  • 使用 KDE Kirigami 时未找到 QML 模块

    所以我决定在我的应用程序中使用 KDE Kirigami UI 框架 所以我按照说明进行操作here https api kde org frameworks kirigami html index html 我将存储库克隆到我的应用程序目
  • 在QT中以不同的时间间隔更新GUI [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道如何在QT中以不同的时间间隔更新GUI 最好的是我可以控制时间间隔 我知道 QTimer 可以在同一时间间隔更新 GUI 但我
  • Qt 的 sysroot 和前缀选项的实际示例是什么

    我正在查看可以运行的所有选项configureQt 提供的脚本 特别是 qt everywhere opensource src 5 2 0 经过大量搜索后 我确定这些东西充其量记录很少 所以我希望我能得到一些帮助 当我查看描述时prefi
  • Qt进度条不是递增的,而是跳跃的

    我遇到 Qt GUI 进度条问题 问题是 对于较大的文件 350MB 及以上 进度条在开始时按预期工作 然后它似乎有一段时间没有移动 然后在工作完成时突然跳到 100 我不确定为什么会发生这种情况 我想知道是否有一些 Qt 之谜导致了这种情
  • Qt Creator 中的按钮是否有隐藏属性?

    Qt Creator 属性托盘中是否有按钮的隐藏属性 我想找到一个 但找不到 我需要禁用一些按钮并隐藏一些按钮 我应该使用属性托盘还是在构造函数中进行 稍后在用户事件中 它们将被启用并显示 有些控件在调色板上具有 可见性 属性 有些则没有
  • Qml 中的 FileDialog 在发布中不起作用

    我正在与以下项目合作Qt Quick Control 2 当我尝试在调试模式下运行软件时 FileDialog qml 可以完美打开 但是当我将其部署为发布模式时 它无法工作 这是我的代码 import QtQuick 2 4 import
  • 无法将 QMap 传递到 SLOT

    所以 这有效 h public slots void addMenu QString passedName signals void clicked const QString text cpp signalMapper new QSign
  • Qt 对象的生命周期

    Qt 对象的生命周期是多少 Such as QTcpSocket socket new QTcpSocket 套接字什么时候会被销毁 我应该使用 delete socket 有什么区别吗 QTcpSocket socket 我找不到有关此的

随机推荐

  • 如何通过HTTP Google Cloud Function上传图像文件?

    我已阅读有关如何将图像上传到存储桶并通过后台功能进行后期处理的教程 但我的要求是上传图像 进行后处理并立即通过HTTP函数返回结果 请让我知道这是否是正确的方法 因为我在网上没有得到太多关于这方面的材料 以下是我的做法 HTTP云功能 ex
  • Github v3 API 让所有组织超过 100

    我正在尝试让所有组织项目通过 默认大小似乎是 30 而 100 似乎是每个请求的最大限制 但上面的链接仍然只返回前 100 项 即不是第 101 200 项 我也尝试过 http host api v3 organizations page
  • 以编程方式截取网页屏幕截图[关闭]

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

    我一直在尝试在 WPF 中为我的课堂作业制作 3D 用户界面 但遇到了一个问题 现在 2 3 天都无法解决 我尝试用谷歌搜索答案 我查看了一些 stackoverflow 帖子 但还没有一个可以帮助我解决问题 情况是这样的 我有一个 3D
  • 如何在 xcode 中打印或查看方法调用堆栈?

    我正在开发我的 iPad 应用程序 运行代码时 表视图中有一种方法 据我们所知 cellForRowAtIndexPath 该方法可以被调用多次 就像一会儿 scrolling table view cells Or table view
  • mysqli_stmt::bind_param():类型定义字符串中的元素数量与绑定变量的数量不匹配,无法更新

    我在提交或更新此数据时遇到问题 数据无法更新 这段代码 if isset GET newsid if isset POST submit sql connect gt prepare UPDATE news set title short
  • Rails:特定 HTTP 错误代码的自定义行为

    我正在开发一个 RoR 网站 希望单独处理服务器错误 400 404 500 等 另外 由于网站是动态的 我想在 Rails 环境中处理错误 而不是在服务器级别 我想做的一个例子是 当用户遇到无法加载或根本不存在的页面或模板时 向用户提供可
  • 从Excel VBA中的单元格范围中删除重复项

    我正在尝试删除 Excel 2013 VBA 中的重复项 但我收到错误 对象不支持此属性或方法 问题是我没有静态范围可供选择 我想从列标题 abcd 中删除重复项 Cells Find what abcd Activate ActiveCe
  • 检查数组中是否存在值(Laravel 或 Php)

    我有这个数组 list desings ids array hc1wXBL7zCsdfMu dhdsfHddfD otheridshere 使用 die var dump 这个数组返回我 array 2 0 gt hc1wXBL7zCsdf
  • Socket.IO中的跨域连接

    是否可以跨域方式使用Socket IO 如果是这样 怎么办 网络上提到了这种可能性 但没有给出任何代码示例 引用socket io 常见问题解答 http socket io faq Socket IO支持跨域连接吗 当然 在每个浏览器上
  • 创建一个加载器,其中线在中心形成一个圆

    这是我的代码 circle border 1px solid transparent border radius 50 width 100px overflow hidden div7 width 100px height 10px bac
  • 正确使用 zend 框架中的语言

    我有一个带有两个模块 管理和公共 的 Zend 应用程序 对于公共 我有以下插件来解析我的友好 URL class Custom Controller Plugin Initializer extends Zend Controller P
  • seq 和 list 之间的区别

    Clojure 语言中的 seq 和列表有什么区别 list 1 2 3 gt 1 2 3 seq 1 2 3 gt 1 2 3 这两种形式似乎被评估为相同的结果 首先 它们可能看起来相同 但实际上并非如此 class list 1 2 3
  • Android 中的文件浏览

    是否有特定的视图 小部件可用于浏览设备上的文件 或者还有其他已被接受的解决方案吗 搜索对我来说有用的信息很少 不幸的是 没有用于浏览文件的特殊视图 小部件 不过自己写也不是很难 谷歌搜索可以找到许多用于文件浏览的公共资源 意图 总体思路很简
  • Episerver - 为什么 BlockData 不实现 IContent

    有谁知道为什么 BlockData 类不直接实现 IContent 我知道在从数据库检索 BlockData 期间 Castle 创建的代理实现了 IContent 如果 StackOverflow 不适合此类问题 请移走它 EPiServ
  • 如何将内容安全策略与本地主机文件一起使用

    我的页面上出现以下错误 Refused to load the script http 127 0 0 1 35729 livereload js because it violates the following Content Secu
  • 在 JTable 中创建鼠标悬停信息面板?工具提示可能还不够

    我想在鼠标悬停时显示一个信息框JTable细胞使用Java 摇摆 所以有多个部分 如何捕获表格单元格中的鼠标悬停事件 我必须能够设置单元格内容 然后获取其数据 如何将鼠标悬停在该单元格上时显示带有动态服务器数据的面板 框 如何缓存信息面板
  • 在 R 中绘制顺序(时间序列)数据的子集

    我有一个类似于下面的数据框 称为 df 我想绘制这些数据的子集 例如May 2012 to June 2014 我一直在使用绘图函数来绘制整个数据框 但是 当我将其分成绘图的子集时 无论我选择数据的哪一部分 我都会得到相同的绘图 Jan F
  • 在 AngularJS 中发送 FormData 和其他字段

    我有一个表格有两个input text和一个upload 我必须将其发送到服务器 但在将文件与文本连接时遇到一些问题 服务器期望这个答案 title first input text second input file my file pd
  • 如何停止线程 - Qthread

    我必须在按下两个不同的按钮时启动 停止线程 请指出我的代码是否正确 我是否错过了 connect 调用中的某些内容 Problem我面临的是 在我的线程上调用 quit 后 然后我等待我的线程完成 但在线程上调用 wait never re