如何停止带有无限循环的QThread

2023-12-14

我有无限线程用于数据接收:

void RxFTDI::process() {

    qDebug() << "RxFTDI hello!" << QThread::currentThreadId();

    while(true)
    {
        FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
//        FT_GetQueueStatus(ftHandle, &RxBytes);
        if ((ftStatus == FT_OK) && (RxBytes > 0))
        {
//            qDebug() << "rx " << RxBytes;
            FT_Read(ftHandle, &RxBuffer, RxBytes, &BytesReceived);

            if (ftStatus == FT_OK) {
                // FT_Read OK
            }
            else {
                // FT_Read Failed
            }
        }
    }
}

当我想删除该线程时,我的应用程序似乎崩溃了delete RxThread;:

bool Ftdi::quitRxTxThreads ()
{
    emit Tx->finished();
    emit Rx->finished();

    delete Tx;
    delete Rx;

    RxThread->terminate();
    TxThread->terminate();

    delete TxThread;
    delete RxThread;

    return true;
}

完整项目位于 github 上:https://github.com/bLLAZ/ftQt这个想法很简单。 GUI + 两个独立的线程:Tx 和 Rx。这是我的第一个Cpp应用程序。如果你们中的一些人可以看一下它并给出一些如何更好地组织它的提示,我将非常感激。


不应从线程外部完成终止/终止线程,因为这可能会导致数据损坏。甚至 Qt 文档也提到了这一点:

警告:此功能很危险,不鼓励使用。这 线程可以在其代码路径中的任何点终止。线程可以是 修改数据时终止。线程没有机会 自行清理,解锁任何持有的互斥体等。简而言之,使用 仅在绝对必要时才使用此功能。

那么该怎么办?我想您可以使用线程之间共享的变量来像这样优雅地完成它们。在类中放置一些标志,如下所示:

public:
    atomic<bool> finish = false;

然后,稍微改变一下流程:

void RxFTDI::process() {

    qDebug() << "RxFTDI hello!" << QThread::currentThreadId();

    while(!finish.load(std::memory_order_relaxed))
    {
        FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
//        FT_GetQueueStatus(ftHandle, &RxBytes);
        if ((ftStatus == FT_OK) && (RxBytes > 0))
        {
//            qDebug() << "rx " << RxBytes;
            FT_Read(ftHandle, &RxBuffer, RxBytes, &BytesReceived);

            if (ftStatus == FT_OK) {
                // FT_Read OK
            }
            else {
                // FT_Read Failed
            }
        }
    }
}

最后运行线程的函数:

bool Ftdi::quitRxTxThreads ()
{
    emit Tx->finished();
    emit Rx->finished();

    delete Tx;
    delete Rx;

    RxThread->finished.store(true, std::memory_order_relaxed);
    TxThread->finished.store(true, std::memory_order_relaxed);
    //now wait for them to finish
    RxThread->wait();
    TxThread->wait();

    delete TxThread;
    delete RxThread;

    return true;
}

当然,这不是最简洁的设计等等,但希望您能明白;)

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

如何停止带有无限循环的QThread 的相关文章

  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr

随机推荐