如何暂停主线程直到第二个线程的终止?

AI绘画与医疗可视化:用AI生成医学插图的实践 医疗可视化是医学教育、临床沟通和学术研究的核心工具。传统医学插图依赖手工绘制或专业3D建模,存在制作周期长、成本高、更新迭代慢等问题。随着深度学习技术的发展,AI绘画工具(如Stable Diffusion、DALL-E)展现出强大的图像生成能力,但医疗领域对插图的解剖准确性、标注规范性和语义完整性有极高要求,通用AI模型难以直接应用。本文聚焦AI技术与医疗领域的交叉创新,系统阐述如何通过数据预处理、模型定制化训练和后处理校验,构建符合医疗标准的插图生成系统。 阅读详情

如何暂停主线程直到第二个线程的终止?

来自 http://www.codeproject.com/threads/waitthreadmsi.asp#xx441032xx

By Ybbozman

不要被线程这个词给吓坏了,留下来先看看吧;)

作为翻译这篇短文的我在VC++开发中遇到了与 Ybbozman 相类似的问题,在主应用程序中(主进程-其实还是线程,称主线程也可),点击“查找”按钮时,我作了一个搜索的递归查找文件的事件-这个事件将非常慢,结果是导致界面重绘明显变慢、cpu资源占用率非常高,原因是windows抢先式多任务将此主线程的优先级置为最高,查找文件事件是作为这个主线程正在执行的事件,cpu大部分的时间片会交给查找文件事件,而界面重绘的操作速率将变得不可预知。

为这个查找文件事件启动一个新的工作线程,是非常高效的,查找文件事件在新的工作线程中工作,但优先级是不会高于当前主线程的,这就保证了界面重绘操作的正常进行,问题是我想在查找文件事件完成后再继续执行主线程的某些操作,这就涉及到线程之间等待-wait(称之为同步-Synchronization更好些)的问题,Ybbozman 的问题与我这个问题有些类似,下面看一下Ybbozman 是如何解决线程之间等待的问题。

简介

 

几周前,我需要制作一个对话框将它作为MSI安装程序(Windows2000的软件安装)的一部分,为此所写的代码必须是作为一个Regular(规则)DLL发布。这个对话框是否可见,完全依赖于安装完成的结果,即该功能依赖于另一个线程(在这里是正在进行的安装过程的工作线程)完成,安装完成后这个线程被终止,并最终显示这个对话框。

 

解决

 

你必须写两个函数,第一个void CMyTestDialog::PeekMessageLoop() 将从消息队列中获取消息:

void CMyTestDialog::PeekMessageLoop()

{

    MSG msg;

    while (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

}

第二个, void CMyTestDialog::WaitForThreadToTerminate(HANDLE hThread) 将指示哪个线程需要等待并作进一步处理:

void CMyTestDialog::WaitForThreadToTerminate(HANDLE hThread)

{

    DWORD dwRet;

    do

    {

        dwRet = ::MsgWaitForMultipleObjects(1, &hThread, FALSE,

            INFINITE, QS_ALLINPUT);

        if (dwRet != WAIT_OBJECT_0)

        {

            PeekMessageLoop();

        }

    } while ((dwRet != WAIT_OBJECT_0) && (dwRet != WAIT_FAILED));

}

示例代码

假设对话框上有一个按钮,当点击按钮时,开始启动第二个线程,等到第二个线程完成后,我们再往下继续主线程:

void CMyTestDialog::OnButton1()

{

    m_pUpdateThread = AfxBeginThread(UpdateDeviceContent,

        (LPVOID)this/*, THREAD_PRIORITY_BELOW_NORMAL*/);

    if (m_pUpdateThread)

    {

        WaitForThreadToTerminate(m_pUpdateThread->m_hThread);

    }

//Do whatever you want after the action is finished

}

 

 

Ybbozman 在解决这个问题时用到了线程之间同步的API函数::MsgWaitForMultipleObjects 函数,它是用于等待某个对象(在这里是要等待的线程T2)的信号态-Semaphore(荷兰著名计算机科学家Dijkstra将进程或线程的同步问题抽象为信号态,顺便愐怀一下Dijkstra,他已于2002年8月6号在荷兰去逝)的一个线程之间的同步函数,当主线程T所等待的线程T2信号态到达时(利用特定的消息-message指示信号态的到达),将返回WAIT_OBJECT_0,::MsgWaitForMultipleObjects的最后一个参数QS_ALLINPUT指定了所有输入消息类型都可作为信号态到达并因此返回,PeekMessageLoop()将消息队列中的所有消息标志为旧消息,因此::MsgWaitForMultipleObjects并不返回,最后,只有当线程T2结束后返回WAIT_OBJECT_0.

 

关于等待多个线程同步的问题,参考::MsgWaitForMultipleObjects函数用法。

 

文中错误难免,请有识之士批评指正

PCL 最小生成树用于法向量定向【2025最新版】 PCL 最小代价生成树用于点云法向量的定向。博客长期更新,本文最近更新时间为:2025年9月15日。 阅读详情

相关推荐

vba 修改下拉列表_Excel联想式下拉菜单制作教程II

?点击关注Excel表哥公众号上期我们分享了Excel联想式下拉菜单制作教程,可以简化大家在下拉菜单过长时的数据录入工作。文章末尾给大家提出了一个问题:为什么下拉列表数据源需要先排序?今天我们继续分享一个不用对数据源排序也能实现的下拉列表制作方法。先看最终的效果动图:今日分享难度指数:★★★★☆01创建辅助列在需要设置下拉列表的工作表中创建一列辅助列,如下图所示:在辅助列F3单元格输入下...

weixin_39593718的博客 1576

如何停止一个正在运行的线程

如果在子线程中用Thread.sleep(),需要对其进行异常捕获,然而捕获以后,线程的中断(讯息)将会被捕获且清除,从而子线程无法感知上层方法中--实例线程对象调用interrupt()对线程的中断,即。现在编码中,通过stop强行停止线程的方法已经被废弃。方法强行终止(不推荐使用该方法,目前该方法已作废)。可见,通过手动调用后,线程执行可以被中断。使用退出标志,使线程正常退出,也就是当。使用退出标志,使线程正常退出,也就是当。显示结果为false;方法完成后线程终止;

NullpointerExcep的博客 2897

零代码做游戏:AI辅助开发HTML5网页小游戏从创意到发布全流程

在软件开发领域,自然语言编程正成为一种新兴的人机协作方式,而AI辅助开发则是其最典型的落地形态。它让开发者无需精通语法,只需用清晰的语言描述游戏规则与交互逻辑,AI便能自动生成可运行的代码。这种模式大幅降低了编程门槛,尤其适合快速验证创意、制作原型。对于HTML5网页游戏而言,借助AI生成单个HTML文件,配合在线运行环境,即可在浏览器中直接试玩、迭代与分享。无论是产品经理验证玩法、运营人员制作互动小游戏,还是教育者设计课堂闯关,都能通过自然语言描述需求,让AI完成代码实现与报错修复。本文完整记录了一个“接

weixin_31497453的博客 333

在Python中,可以使用以下五种方法暂停线程

3.使用threading 模块的Condition()方法:使用threading模块创建一个Condition 对象,然后使用Condition的wait()方法暂停线程的执行,直到其他线程调用了Condition对象的notify()或notify_all()方法才会继续执行。2.使用 threading 模块的 Event()方法:使用 threading 模块创建一个Event 对象,然后使用Event的wait()方法暂停线程的执行,直到 Event 的set()方法被调用才会继续执行。

weixin_37451281的博客 1655

Anolis 8系统下,手把手搞定Nginx、Redis、JDK8和Tomcat9的完整安装与配置(含开机自启)

本文详细介绍了在Anolis 8系统下搭建Java Web全栈环境的完整流程,包括JDK8、Tomcat9、Nginx和Redis的安装与配置,并实现系统级服务管理。通过深入每个组件的配置细节,揭示服务间的协同关系,最终打造一个生产级可用的标准化环境。

weixin_42556197的博客 159

深入了解BPM及BPM业务流程管理系统

BPM 即业务流程管理,是一种以规范化的构造端到端的卓越业务流程为中心,以持续地提高组织业务绩效为目的的系统化方法。它涵盖了业务流程的整个生命周期,包括流程的设计、执行、监控、分析和优化。BPM 作为一种先进的管理方法,对于企业提高运营效率、降低成本、提升客户满意度和增强竞争力具有重要意义。BPM 流程管理系统为企业实现 BPM 提供了强大的工具和支持,而 F2BPM 流程管理平台以其先进的技术架构、丰富的功能模块、简单易用的操作界面和强大的定制能力,成为企业实现业务流程管理的理想选择。

Stone3625的博客 2952

Python多线程中比time.sleep更好用的暂停方法

Python多线程中比time.sleep更好用的暂停方法

IT之一小佬的博客 7757

electron打包客户端在rk3588上支持h265硬解

前言我们的客户端程序是用electron打包的前端程序,其在rk3588主机上的linux环境运行。之前使用客户端查看h264编码的视频直播是没有问题的,但视频源更改为h265编码后就不能查看了,奇怪的是打包的windows客户端则可以正常查看,另外rk3588主机上的chromium浏览器也是支持播放h265编码的视频的,并且是硬件解码。

lxkj_2024的博客 2007

C++11: 线程的暂停和继续和停止

当我们执行一个如图片处理视频处理等费时费CPU的操作时,很多时候是将其移到一个线程,并监测其进度,如果这个时候我们需要提供 暂停、恢复、停止的功能,本文就用C++11来实现其功能。 C++11 提供了线程(std::thead,std::async等)以及线程安全等控制(如std::unique_lock std::lock_guard, s...

hai7song的专栏 1万+

离散系统傅里叶变换的常用结论证明

本文介绍了离散系统傅里叶变换的三个重要结论:1)时域卷积对应频域相乘(公式1-3);2)时域相乘对应频域卷积(公式4-6);3)帕塞瓦尔定理(公式7)及其广义形式,证明信号能量在变换域保持不变。文末提供了MATLAB卷积运算演示程序,通过动画展示离散信号卷积过程(翻转、平移、相乘、累加),并以方波信号为例给出运行结果图。该程序直观呈现了卷积运算的步骤与结果。

newtton的博客 1303

oscp备考,oscp系列——Djinn3靶场:ssti漏洞,pkexec提权

oscp备考,oscp系列——Djinn3靶场:ssti漏洞,pkexec提权难度简单偏上对于低权限shell获取涉及:ssti漏洞对于提权:pkexec提权。

2202_75361164的博客 633

C#多线程——Thread睡眠、中断、合并、暂停与恢复、终止

C#多线程的一些操作,Sleep、Join、Interupt、暂停与恢复(重点)、终止

AronZhang的博客 3万+

【YOLO26实战全攻略】09——YOLO26多目标跟踪实战宝典:从原理到智慧园区人流统计全流程

多目标跟踪(MOT)是视频分析的核心技术,解决了单帧检测无法关联目标身份的痛点。本文基于YOLO26轻量化检测模型与ByteTrack跟踪算法,从新手视角出发,系统讲解多目标跟踪的核心原理、环境搭建、实操步骤与工程落地。内容涵盖ByteTrack分层关联策略解析、YOLO26集成跟踪的一行代码实现、配置参数调优、区域计数、轨迹数据提取与热力图可视化,最终通过智慧园区人车流量统计虚拟案例,完整呈现从技术原理到实际应用的全流程。本文注重实用价值,所有代码可直接复现,参数配置附带场景化建议,帮助新手快速上手。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 355

Java终止与暂停线程

终止线程的典型方式: 终止线程我们一般不使用JDK提供的stop()/destroy()方法(它们本身也被JDK废弃了)。通常的做法是提供一个boolean型的终止变量,当这个变量置为false,则终止线程的运行。 终止线程的典型方法: public class TestThreadCiycle implements Runnable { String name; ...

赵广陆 700

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

控制多线程,开启、暂停、继续、终止(实例)

控制多线程,开启、暂停、继续、终止(实例)   我们这些文盲以前一听到多线程这么几个字,以为非常的高级,难搞!!昨天翻阅了一下MSDN,发现,其实也没那么难,关键在于全面的理解,也许是用多了API了,慢慢的会看懂了一些!!!                                       我总结了几个易于理解的出来,一起共享!        我们先不讲如何使用线程过程中的参

songjinn的专栏 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java终止或暂停线程

前言 使用stop方法 前言  在Java中有几种方式会使线程结束运行.  1.线程执行任务完毕,正常退出;  2.线程遭遇异常,释放所占用的锁,并退出;  3.线程调用stop()方法,强制终止线程;  4.线程使用interrupt方法中断线程.  本文章主要讨论使用stop方法和interrupt方法退出线程,并讲述如何暂停线程. 使用stop方法...

皮蛋瘦肉的博客 2325

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Delphi 线程的开始、暂停、继续、停止

本文代码仓库地址: gitee码云优快云笔记仓库地址 新建VCL窗体应用程序 控件:Button*6、Memo 窗体代码 unit Unit1; interface uses uThreads, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdC

小印丶的笔记 4830

线程的暂停、恢复和终止

(相对应的,Sleep方法要是传递Timeout.Infinite值,那么不能恢复了,只能让另一个线程调用被暂停线程的Thread.Interrupt方法使它终止)2.可以在当前执行的线程上或者另一个线程上调用Thread.Suspend方法,而Thread.Sleep方法只能在当前线程上调用。另外,无论对一个给定的线程调用多少次Thread.Suspend方法,调用一次Thread.Resume方法就可使线程恢复执行。Console.WriteLine("[主函数]开始创建工作线程");

biyusr的专栏 476

MFC--控制多线程,开启、暂停、继续、终止

关注微信公众号“二进制小站”~~获取更多分析~~(文末二维码~~) 文章转自:http://www.cnblogs.com/yushao/archive/2010/02/08/1666069.html 控制多线程,开启、暂停、继续、终止(实例) 我们这些文盲以前一听到多线程这么几个字,以为非常的高级,难搞!!昨天翻阅了一下MSDN,发现,其实也没那么难,关键在于全面的理解,也许是用多...

XingyuZhengtu的博客 1万+

python暂停主线程_python线程暂停

Python基础系列讲解——线程锁Lock的使用介绍我们知道Python的线程是封装了底层操作系统的线程,在Linux系统中是Pthread(全称为POSIX Thread),在Windows中是Windows Thread。因此Python的线程是完全受操作系统的管理的。但是在计算密集型的任务中多线程反而比单线程更慢。这是为什么呢?在CPyt...文章千锋Python讲堂2019-12-1279...

weixin_39687881的博客 944

C++优雅地开启/暂停/停止线程——基于观察者模式

在编程中经常需要创建子线程来执行耗时的任务,避免主线程卡死,提高程序性能。其中有很多业务场景需要我们可以自由控制子线程的开启/暂停/终止。比如音视频播放器,除了用来操作ui控件的GUI主线程外,还有音视频数据解封装线程、视频解码线程、音频解码线程。用户按下“播发”按钮要能开始播放视频(开启所有子线程),用户按下“暂停”按钮要能暂停播放视频(暂停所有子线程”,用户按下“停止”按钮要能结束播放视频(终止所有子线程)。针对这种业务场景我们需要有个机制:当用户按下某个按钮后,GUI主线程可以通知所有的子线程开启/暂

崔杰城的博客 3059

QT QTimer定时器和主线程之间的关系

QT QTimer定时器和主线程之间的关系

weixin_41573966的博客 8646

python线程暂停恢复退出的群_线程的暂停、恢复和终止

要是一个线程进行到一半,想终止了,怎么办呢?请看代码:usingSystem;usingSystem.Threading;classThreadTest{//工作线程的方法publicstaticvoidWorkerThreadMethod1(){//获得当前正在执行的线程对象Threadw1=Thread.CurrentThread;w1.Name="工人1号正在工作中";fo...

weixin_39632379的博客 512
上一篇: 头一次使用csdn的blog,测试一下。
下一篇: HTML特殊字符 - 补遗
sailingcelery
博客等级 码龄25年 0粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值