Qt线程池waitForDone+等待框

2023-11-07

QThreadPool::waitForDone()可阻塞线程,采用std::function方式将其置于其它线程执行,避免阻塞线程同时可设置等待框(其它线程)生存期,单纯不阻塞线程可以直接不使用waitForDone。

一.调用

DlgProcess wait(QString("检查中"));
wait.WaitFor([&]()//std::function<void()>& task //&表示引用传递捕捉所有父作用域变量
{
     m_pThreadPool->waitForDone();//猜测只有在此函数作用域内wait导致m_pProgress有效
});

二.DlgProcess

DlgProcess::DlgProcess(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DlgProcess)
{
    ui->setupUi(this);

    m_timer=new QTimer(this);    
    connect(m_timer, SIGNAL(timeout()), this, SLOT(UpdateMsg()));//每隔1秒刷新
    m_nDotjs=0;
    m_nStep=0;
}

DlgProcess::~DlgProcess()
{
    delete ui;
}

void DlgProcess::WaitFor(const std::function<void()>& task)
{
    int w = 200;
    int h = 100;

    //设置显示位置
    this->setFixedSize(w,h);
    QDesktopWidget* deskWidget = QApplication::desktop();
    QRect deskRect = deskWidget->availableGeometry();//QDesktopWidget
    double x = (deskRect.width() -w)/2;   //设置对话框居中于桌面
    double y = (deskRect.height()-h)/2;
    this->move(x,y);

    this->setWindowModality(Qt::ApplicationModal);
    m_timer->start(1000);//每隔1秒刷新

    this->m_task = task;//std::function<void()>
    //this->exec();//触发showEvent
    if (m_task != nullptr)
    {
        m_thread = new ThreadTask(this,this->m_task);//设置多线程,任务结束时关闭
        m_thread->start();
    }
}

void DlgProcess::setStep(int nStep)
{
    ui->progressBar->setValue(nStep);
    //update();//会调用
}

void DlgProcess::SetMsg(QString sMsg)//修改文本
{
    m_sMsg=sMsg;
    //ui->label->setText(m_sMsg);
}

void DlgProcess::UpdateMsg()
{
    //刷新下面文字
    QString sMsg=m_sMsg;
    for(int i=0;i<m_nDotjs;i++)
    {
        sMsg+=".";
    }
    ++m_nDotjs;
    if(m_nDotjs>3) m_nDotjs=0;
    ui->label->setText(sMsg);

    update();
}

void DlgProcess::showEvent(QShowEvent *event)//初次显示时触发
{
    if (m_task != nullptr)
    {
        m_thread = new ThreadTask(this,this->m_task);//设置多线程,任务结束时关闭
        m_thread->start();
    }
}

三.waitForDone移至QThread运行

ThreadFun::ThreadFun(const std::function<void()>& task)
{
    this->m_task = task;
}
void ThreadFun::run()
{
    if (this->m_task != nullptr)
        this->m_task();//猜测将外部函数移至线程内执行,此处可避免主界面阻塞

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

Qt线程池waitForDone+等待框 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 为什么禁止在 constexpr 函数中使用 goto?

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

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

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • chatgpt赋能python:超出Python用什么?前端开发和数据科学领域的其他编程语言

    超出Python用什么 前端开发和数据科学领域的其他编程语言 Python是一种强大的编程语言 广泛应用于各种领域 例如Web开发 数据分析 机器学习和人工智能等 然而 Python并不是唯一的选择 在某些情况下 其他编程语言可能更适合特定
  • 谷粒学院-项目后端总结

    项目总结 项目层次划分 controller Autowired注解 spring可以自动帮你把Bean里面引用的对象的setter getter方法省略 它会自动帮你set get Autowired注释进行自动注入时 spring容器中
  • anaconda创建、激活(打开)、关闭、删除虚拟环境

    点击开始菜单 然后找anaconda文件夹 里面的anaconda prompt 打开 输入下面的命令 conda create n 环境名 python 3 6 这句话的意思就是创建一个python虚拟环境 开启虚拟环境 source b
  • LoRa无线数传终端的功能特点

    LoRa 无线数传终端是一种基于 LoRa 扩频技术的无线数据传输终端 利用 LoRa 网络为用户提供无线数据传输功能 该产品采用高性能工业级 LoRa 芯片 同时提供 RS232 和 RS485 接口 产品功耗低 传输距离远 环境适应性高
  • StarGLM:天文大模型

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 2023年9月22日 19 00 20 00 李瑀旸 中国科学院国家天文台博士在读 集思谱 北京 科技有限公司首席信息官 CIO 主要方向为人工智能在科研领域的开发与应用 目前正
  • C++类的静态成员和this指针

    静态成员 概述 C 类中的静态成员一共有两种 静态成员变量和静态成员函数 被关键字 static 声明为静态的 称为静态成员 不管这个类创建了多少个对象 静态成员只 有一个拷贝 这个拷贝被所有属于这个类的对象共享 静态成员变量 在一个类中
  • Java编程到底是用idea好还是eclipse好?

    IDEA 全称 IntelliJ IDEA 是java编程语言开发的集成环境 IntelliJ在业界被公认为最好的java开发工具 尤其在智能代码助手 代码自动提示 重构 JavaEE支持 各类版本工具 git svn等 JUnit CVS
  • QT学习笔记(五)

    第6章 布局管理 放置在窗体中的每一个窗口部件都必须给定一个合适的大小和位置 Qt提供了多个用于在窗体中摆放窗口部件的布局类 使用Qt布局类的另一个原因是 他们可以确保窗体能够自动适应于不同的字体和系统平台 在窗体中摆放窗口部件 共有三种方
  • 每日一题:01序列

    01序列 题目 Daimayuan Online Judge 大致题意是字符串中只有0和1 找出有多少个子串含有k个1 依次记录每个1的下标 枚举每个1 运用乘法原理 比如01010100 找含有2个1的子串 先枚举第一个橙色的1 然后如果
  • 大數據環境搭建,數據採集,數倉環境準備(hive on spark) 01

    服務器搭建 更改時區 改爲cst sarah hadoop104 ha sudo vi etc sysconfig clock zone Asia Shshanghai sarah hadoop104 ha sudo rm rf etc l
  • OpenGL 纹理数组

    参考 glTexStorage3D glTexStorage3D glTexImage3D glTexSubImage3D glTexStorage3D code example
  • 完美解决,Lightroom CC关闭嵌入式预览

    https www google com search q lr embedded preview turn off sxsrf ALeKk02iHFAT8ggQpkYCHhCRhi67nlPSOQ 3A1627959107736 ei Q
  • 数据结构学习系列之单向链表的两种创建方式

    方式1 通过返回值返回所申请的头结点所在的内存空间首地址 即创建单向链表的头结点 代码如下 示例代码 node t create link node 1 node t phead node t malloc sizeof node t if
  • 软件发展史

    尘埃落定海上花原帖地址 计算机硬件发展 底层应用逐渐完善 软件系统趋向工程化 理论化 程序设计趋向自动化 这使得软件开发工作变得越来越容易 同时 计算机网络和通信技术发展 软件面向的用户越来越多 应用领域越来越广泛 因此软件越来越复杂 软件
  • Arduino:数码管显示原理详解和Proteus仿真实验

    Arduino 数码管显示原理详解和Proteus仿真实验 Proteus仿真 数码管介绍 数码管是半导体发光元件 其基本单元是发光二极管 根据段数 数码管分为七段管和八段管 八段管比七段管还多一个发光二极管单元 小数点多一个 我们将在这个
  • C0232 [2016普及组-A]买铅笔-C语言写

    题目描述 P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物 她发现商店一共有3种包装的铅笔 不同包装内的铅笔数量有可能不同 价格也有可能不同 为了公平起见 P老师决定只买同一种包装的铅笔 商店不允许将铅笔的包装拆开 因此P老师可能需
  • ctfshw (萌新赛)

    目录 萌新记忆 签到题 web 假赛生 0x2f666c6167是 flag得hex编码 用于更改cookie的值 萌新记忆 发现页面都没什么可利用的 尝试访问别的页面 用dirsearch可以扫描出 admin 目录 没错 是扫出目录而不
  • yolov5如何开启和关闭mosaic(马赛克)增强

    总结 将 hyp scratch yaml中的mosaic设置为0 表示关闭马赛克增强
  • 目标检测中的一些评价标准(ACC,Precision,recall,AP,MAP,F1Score,ROC,AUC)

    目标检测中的一些评价标准 ACC Precision recall AP MAP F1Score ROC AUC 介绍这些之前 应该了解一下最基本的TP TN FP FN 先看一下下面这些解释 True positives 简称为TP 即正
  • Qt线程池waitForDone+等待框

    QThreadPool waitForDone 可阻塞线程 采用std function方式将其置于其它线程执行 避免阻塞线程同时可设置等待框 其它线程 生存期 单纯不阻塞线程可以直接不使用waitForDone 一 调用 DlgProce