如何结束线程?

上交开源装甲板识别代码分析 GitHub - xinyang-go/SJTU-RM-CV-2019: 上海交通大学 RoboMaster 2019赛季 视觉代码这里着重分析主函数main.cpp与装甲板识别部分的工程文件armer文件夹。由于未完全分析,所以对于其中log.h、options.h中的函数并不清楚,在分析时会跳过这些内容。该文章重点分析的是思路,部分函数中的数学逻辑、数据处理思路这里不详细解释(没能力)所有思维导图通过 知犀知犀思维导图 - 知犀官网 (zhixi.com)原创。 阅读详情

如何从其他线程结束下面这个线程?   
   DWORD    WINAPI    ThreadProc(LPVOID    param)   
   {   
           while    (b    ==    TRUE)   
           {   
                   xxx_func(...);   
           }   
    
           return    0;   
   }   
   本来我是用TerminateThread来结束这个线程的,但由于TerminateThread太粗暴,没有释放线程资源,从任务管理器中看到有内存泄漏。   
   一般地,当需要结束该线程时,设置b=FALSE即可使线程运行到while(条件)时结束循环,从而正常结束线程。但问题是由于xxx_func是一个 阻塞的函数(比如accept、WaitForCommEvent等函数),所以通常这个线程停止在xxx_func处等待,运行不到 while(b==TRUE)处。   



(1)不要用   
   while(b    ==    TRUE)   
   应该用   
   while(b)   
    
   (2)既然您已经能通过b来控制ThreadProc   
   您的主要问题是:   
    
   xxx_func是一个阻塞的函数   
    
   因此,解决方法是:   
   让xxx_func每次只阻塞很短的时间。   
    
   (3)如果结束线程的行为发生在进程即将结束,   
   那么,您可以   
   <1>通过CreateThread返回的HANDLE来判断线程是否结束,   
         在线程结束后,主线程再结束。   
   <2>通过在ThreadProc内的另外一变量来判断线程是否结束。   
   比如   
    
   BOOL    bThreadRun    =    FALSE;    //    线程正在运行的标志   
   DWORD    WINAPI    ThreadProc(LPVOID    param)   
   {   
           bThreadRun    =    TRUE;   
           while    (b    ==    TRUE)   
           {   
                   xxx_func(...);   
           }   
    
           bThreadRun    =    FALSE;   
           return    0;   
   }   
    
    
   总之,没有办法能让线程“正常地立刻”结束,   
   您应该等待它结束。   
    
    



在xxx_func里面可以使用WaitForMultipleObjects,用一个全局的HANDLE来控制xxx_func的结束



我是想寻找一个让线程"正常地立刻结束"的方法,或没有内存泄漏的"不那么正常立刻结束"的方法也可。   
   把xxx_func设成每次等待很短时间不好设啊。它可能等待几微秒,也可能等待几秒,也可能几个小时,说不定的。   
   结束线程的行为不是发生在进程即将结束,而且是可能结束了后又要再次生成新的线程,这样才有内存泄漏的问题啊,如果结束线程的行为发生在进程即将结束,那用TerminateThread也无所谓了,泄漏的内存由系统也可回收。



xxx_func是accept、WaitForCommEvent之类的系统函数,不是我自已写的函数。



设一个线程是否要退出的标志,阻塞函数不应无限至阻塞,应该设一个等待时间循环判断,等待的时间设短一点比如几十毫秒,这样在每次等待后判断线程退出标志   
   退出标志应定义为    volatile



用TerminateThread()函数



由主线程将退出标志设为"要退出",退出标志应该是全局变量,且应加"volatile"定义,这样就保证子线程和主线程读取和设置的是同一个变量   
   主线程退出前先设置该标志,然后等待一段时间让子线程退出,一段时间后若子线程仍未退出,则只能Terminate了



1、使用TerminateThread()   
   2、使用全局变量   
   bool    bExit;   
   void    CTestView::OnButton1()        //启动线程     
   {   
                     bExit    =    false;   
   FThread=CreateThread(NULL,0,thx,   
   (LPVOID    )&x,CREATE_SUSPENDED,&dwThreadID);   
    
   ResumeThread(FThread);   
   }   
   DWORD    WINAPI    thx(LPVOID    param)   
   {   
   while(TRUE)   
   {   
       //...   
   }   
   if(bExit)   
   ExitThread(0);   
    
   }   
   return    0;   
   }   
   void    CTestView::OnButton2()    //终止线程   
   {   
   bExit    =    true;   
   }



看来是没有好的方法。   
    
   期望找到一下类似于下面这样的实现方法:   
   void    CTestView::OnButton1()        //启动线程     
   {   
   hThread=CreateThread(NULL,0,thx,(LPVOID    )&x,0,&dwThreadID);   
   }   
   DWORD    WINAPI    thx(LPVOID    param)   
   {   
   while(TRUE)   
   {   
           try   
                             {   
                                     xxx_func(...);   
                             }   
                             catch    (...)   
                             {   
                                     ExitThread(0);   
                             }   
   }   
   return    0;   
   }   
   void    CTestView::OnButton2()    //终止线程   
   {   
   throw    exception    to    pThread;   
   }



我想发帖子,怎么发不了啊?   



最安全的办法是线程的循环体里面检查一个退出事件,此事件一触发就自己清除资源并return。       
   要通知此线程退出的模块就PostThreadMessage函数,将退出事件post给该线程。       
      
   hEventFinish          =          CreateEvent(NULL,TRUE,FALSE,NULL);//创建手工重置的Event对象           
      
   DWORD      WINAPI      DisplayData(LPVOID      param)       
   {       
                         while(TRUE)       
                         {       
                                         if(      WaitForSingleObject(pDlg->hEventFinish,0)          ==          WAIT_OBJECT_0)               
                                                         return          0;                                                                          //让线程函数正常返回       
      
                              
                         //...DisplayData       
      
                              
                         }       
                         return      0;       
   }       



问题是在xxx_func处阻塞了啊



如果是一定要阻塞,且是无限制时间的,那就没有办法了.比如你的主线程阻塞了,而你却非要它自己退出来,这可能吗?



不知你是否可以用MsgWaitForMultipleObjects,这样检测到一定的事件发生也可以退出阻塞等待



if    (!this->m_hThread)   
   return    FALSE;   
    
   TRACE(_T("Killing    thread    %x    .../n"),    m_hThreadId);   
    
   //    reset    the    m_hEventKill    which    signals    the    thread    to    shutdown   
   VERIFY(::SetEvent(this->m_hEventKill));   
    
   //    allow    thread    to    run    at    higher    priority    during    kill    process   
   if    (::WaitForSingleObject(this->m_hThread,    m_dwKillingWait)    ==    WAIT_TIMEOUT)   
   ::TerminateThread(this->m_hThread,    0);   
    
   TRACE(_T("Thread    %x    killed/n"),    m_hThreadId);   
    
   ::ResetEvent(this->m_hEventKill);   
    
   m_bActive    =    FALSE;   
    
   return    TRUE;



  
   DWORD    WINAPI    Check(LPVOID    lpParameter    )      //    thread    data   
   {   
   //DebugBreak();   
   COoDlg    *pMonitor    =    (COoDlg*)lpParameter;   
   while(pMonitor->bStart)   
   {   
   OVERLAPPED    opd;   
   if(NotifyAddrChange(NULL,&opd)    ==    NO_ERROR)   
   {   
   TRACE("aaa");   
   }   
   WaitForSingleObject(pMonitor->m_hThread,5000);   
   }   
   return    FALSE;   
   }   
   void    COoDlg::OnOK()     
   {   
   DWORD    ThreadID;       
   m_hThread    =    CreateThread(NULL,0,Check,this,0,&ThreadID);   
   if(m_hThread    ==    NULL)   
   {   
   //AfxMessageBox("创建监控线程失败!");   
   return    ;//FALSE;   
   }   
   else   
   {   
   bStart    =    true;   
   return    ;//TRUE;   
   }   
   return    ;//FALSE;   
    
   }   
    
   void    COoDlg::OnCancel()     
   {   
   bStart=0;   
   if(m_hThread)   
   {   
   if(::WaitForSingleObject(m_hThread,1000)    ==    WAIT_TIMEOUT)   
   {   
   //如果超时:   
   TerminateThread(m_hThread,NULL);   
   }   
   CloseHandle(m_hThread);   
   m_hThread    =    NULL;   
   }   
   //CDialog::OnCancel();   
   }   



阻塞处应该总有一个超时什么的吧,可以用WaitForSingleObject设置一下超时返回,这样就可以跳出阻塞了

YOLOv8融合HAttention:激活更多像素的注意力机制科研实践指南 HAttention通过层级化像素激活与融合的设计,为YOLOv8的像素级特征利用能力带来了质的飞跃。从原理理解到代码实现,再到集成调优,每一步都是科研中“解决像素信息遗漏难题”的具体实践。如果你在实验中发现某类细节或大尺度目标的检测仍有不足,可以尝试结合数据增强(如随机裁剪、多尺度训练)来强化模型对像素特征的学习能力。科研的价值在于不断挖掘技术的潜力,希望这份指南能真正帮你在目标检测的像素级特征利用领域找到新的突破点,祝你在科研探索中持续收获创新与成长。 阅读详情

相关推荐

DIY等离子环:从Class-E电路到七彩辉光,手把手教你打造炫酷科学玩具

本文手把手教你DIY一个炫酷的等离子环科学玩具。从解析等离子体辉光放电原理入手,详细介绍了核心的Class-E自激振荡电路设计、关键元件选型与参数计算,并提供了从物料准备、电路搭建、腔体密封到上电调试的全流程指南。通过调制电路或填充不同气体,还能实现七彩变换与交互效果,是学习高频电路与电磁场知识的绝佳实践项目。

weixin_29305337的博客 634

判断网络未连接的方法

 以下两种方法都通过超时连接的方式判断网络连接:一:DWORD   flags;//上网方式    BOOL   InternetState;    InternetState=InternetGetConnectedState(&flags,0);    if(!InternetState)网络未连接;二:#include OVERLAPPED   overLapped; 

None 903

电赛备赛笔记:用STM32驱动AD9959信号发生器模块,从接线到出波保姆级教程

本文详细介绍了如何使用STM32驱动AD9959信号发生器模块,从硬件接线到软件调试的全流程。AD9959作为高性能DDS芯片,适用于电子设计竞赛中的信号生成需求。文章包含硬件连接指南、寄存器配置解析、多通道控制技巧以及常见问题解决方案,帮助参赛者快速掌握AD9959的应用。

weixin_31858171的博客 366

关于socket的Accept阻塞模式的退出方法分析

众所周知,socket的Accept会当前线程。如果子程序,或者类在被回收时,没有正确的中止socket,则会引发一些异常。 我说一下常用的一些方法: 1.强行中断线程。     这种方法我觉得是最差的,因为强行中断正在执行的线程,可能会引发一些意想不到的结果,这是最差的方法。 2.在Socket上调用Pending()方法。     这种做法的原理就是:        a.看Sock

badboy518的专栏 1万+

在Ansys Simplorer中设计三相逆变器,并与Maxwell FEA耦合,实现160kW PMSM

在这篇博文中,我们将探讨如何使用设计三相逆变器,并将其与Ansys Maxwell中的电磁有限元分析模型耦合,以获得准确的系统级结果。Ansys Electronics为多域仿真提供了强大的生态系统,可实现跨各种物理领域的无缝集成。Maxwell用于电磁有限元分析 (FEA),Simplorer(Twin Builder) 用于系统级逆变器和控制器设计,Icepak用于电子热仿真。例如,我们将使用 Simplorer 介绍160 kW、8 极永磁同步电机 (PMSM)的逆变器设计过程。让我们开始吧!

jkh920184196的博客 1424

人工智能入门系列之一: 鸢尾花(Iris)多分类的神经网络详解及代码实现

这是最好的时代,我们一起来打造属于自动驾驶汽车上路、无人机飞天、智能机器人管工厂的AI未来 人工智能领域分化为两个阵营:其一是规则式(rule-based)方法,在人工智能早期占主峰;其二是神经网络(neural network)方法,后起之秀。随着硬件水平的提高,算力的指数式增长;人工智能的重心已经从规则式的专家时代转移到神经网络的数据时代。 “神经网络”不选择把人脑熟稔的逻辑规则传授给计算机...

NLP家的码奴小荷的博客 2万+

线程阻塞怎么结束

线程有read, accept 之类阻塞的函数,如果主程序退出没有及时让子线程退出,子线程会奔溃。 解决方法:close 函数关闭对应的fd, 阻塞函数就会退出

19线程序员的成长之路 2582

nnU-Net v2实战:从零开始配置环境与训练自定义医学影像数据集

本文详细介绍了nnU-Net v2在医学影像分割中的实战应用,从环境配置到自定义数据集训练的全流程。重点讲解了Python 3.9+环境搭建、PyTorch安装技巧、医学影像数据预处理规范,以及五折交叉验证训练方法,帮助开发者快速掌握这一先进的医学影像分析工具。

weixin_28718487的博客 352

accept函数及示例

这次我们介绍 函数,它是 TCP 服务器用来接受客户端连接请求的核心系统调用。 是一个 Linux 系统调用,专门用于TCP 服务器(使用 套接字)。它的主要功能是从监听套接字(通过 设置的套接字)的未决连接队列(pending connection queue)中取出第一个连接请求,并为这个新连接创建一个全新的、独立的套接字文件描述符。你可以把 想象成总机接线员:这个新创建的套接字文件描述符专门用于与那一个特定的客户端进行双向数据通信。原始的监听套接字则继续保持监听状态,等待并接受更多的连接请求。

悟空看八戒烤熟了没的专栏c)4Upqt4SeVk 1593

从零上手:基于英飞凌TC377的UDE STK 5.0实战调试指南

本文详细介绍了基于英飞凌TC377芯片和UDE STK 5.0的实战调试指南,涵盖硬件连接、工作空间配置、程序烧录、多核调试等关键步骤。特别针对汽车电子领域常见的多核架构调试难题,提供了断点设置、变量监控等实用技巧,帮助开发者快速上手并优化调试效率。

weixin_30839881的博客 683

【24E】SWT6652 wifi驱动加载失败问题分析及解决方案

修改驱动配置Kconfig。是由于内存分配失败导致。

wgl307293845的博客 219

终止线程 4 种方式

1、正常运行结束 程序运行结束,线程自动结束。 2、使用退出标志退出线程 一般 run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如: 最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while 循环是否退出,代码示例: public class ThreadSafe extends Thread { public volatile b

Be Like 1万+

Codex入门01-环境安装(小白入门:手把手教你安装配置,国内网络也能搞定)

本文手把手教你从零搭建 Codex CLI 开发环境。内容涵盖 Node.js 安装(macOS/Windows/Linux)、Codex CLI 全局安装、ChatGPT 账号登录认证,以及国内网络代理配置。还包括常见问题排查和一键启动脚本编写。跟着截图一步步操作,10分钟搞定全部环境,开始用AI写代码!

yueyeguzhuo的专栏 344

android 线程 结束线程结束,Android 多线程之判断线程结束

Android 多线程之判断线程结束最近在做多线程断点线程的时候,遇到一个问题,因为需要在多线程下载完成时候,对文件进行处理,而处理肯定是在文件下载完成时候,而下载完成时候肯定是多线程都完成时候,所以怎么判断多线程完成呢?也是百度了很多文章,也都试了试。但是都发现不能解决自己的问题。没有解决问题的方案1.线程池 然后shutdown 然后判断是否terminate,如果terminate返回为tr...

weixin_30465509的博客 1346

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

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

C++关于线程结束编程

一线程主动结束 1点睛 线程主动结束一般是线程函数使用return语句或调用pthread_exit函数。 2线程终止并得到线程的退出码 #include <pthread.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <errno....

实践求真知 2963

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python如何强制结束主线程_强制结束线程

场景: 如果某个线程持续阻塞,无法退出,从而导致整个程序无法结束,此时就需要强制结束线程思路:由于程序阻塞,比如卡在代码中的某一行后,一直无法向下执行,此时,无法通过常规方式结束线程方法1: 采用线程自己的方法强制结束Thread._Thread__stop(thd_obj),此种方式的优点是可以强制结束在某一行代码处卡住或者正在运行的线程注:此处的卡住指的是线程正在发生io阻塞,此时,无法...

weixin_39850981的博客 4176

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python多线程中主线程、子线程谁先结束,主线程结束是否子线程一定结束

最近在学python,对于多线程执行时,主线程是否会主动等着子线程结束后才结束,还是主线程先结束也没关系,子线程会继续执行完毕说法不一,我自己试了,代码如下。 先说结论: 1、主线程可以先于子线程结束,但仅仅是结束(stop状态),主线程对象还在; 2、子线程先于主线程结束,子线程对象直接销毁,表现就是threading.enumerate()里没有那个结束的子线程对象了 所以,用主线程最后一句的打印来判断主线程可以先结束有点草率,要知道打印最后一个符号之前主线程都是好好的 #coding=utf-8 im

weixin_49474047的博客 2050

python thread在主线程结束的时候结束子线程

蓝桥杯比赛 单片机组 历届国赛题目解答国赛题目 国赛题目        蓝桥杯省赛之后不到一个月就是国赛了,我先给大家分享到这里,小伙伴们可以先关注收藏然后后续有需要可以再来看看哦,点击下面的文字,就可以查看你想要的内容,资源免费获取!(哦,对了也有的小伙伴选择省赛国赛一起准备哦~)(持续更新中…)     1、蓝桥杯比赛 单片机组 第十届国赛题目解答 2、蓝桥杯比赛 单片机组 第九届国赛题目解答   除此之外,有需要的小伙伴可以随时私信我,讨论学习过程中的问题,我会尽我所能提供一些帮助的    

自由学者亻伊宸的博客 4982

python 强制结束线程

总结一下网上关于结束线程的方法 1.通过threading.Thread._Thread__stop()结束线程 import time import threading def f(): while 1: time.sleep(0.1) print(1) t = threading.Thread(target=f) t.start() time....

smallsmallmouse的博客 2万+

QT创建线程以及结束线程

参考: 原文链接:https://blog.youkuaiyun.com/z1houcheng12/article/details/80595166 原文链接:http://blog.youkuaiyun.com/liang19890820/article/details/52186626 基本知识: 穿件线程的两种方法 方法一: 1:基于QThread创建一个线程对象 2:重写run函数,run函数就是线程运行的主体。 使用 1:实例化对象 2:调用start()就可以运行线程的run函数 方法二: 1:基于QObject创建对

qq_44635313的博客 4313

java如何结束主线程且不结束子线程

在Java中,主线程是程序的入口,它负责启动和管理其他的子线程。当主线程结束时,程序通常会终止,包括所有的子线程。然而,在某些情况下,我们希望主线程结束后,子线程能够继续运行,这就需要使用一些特殊的技巧。本篇博客介绍了如何使用守护线程来实现在结束主线程时不结束子线程的功能。通过设置子线程为守护线程,主线程结束后,子线程会自动终止。在实际开发中,我们可以根据具体的需求来选择是否使用守护线程。希望本篇博客对于理解和应用Java多线程编程有所帮助。如果你有任何问题或建议,请在下方留言,我会尽快回复。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1084

线程如何退出结束

在Java中,线程的结束和退出需要根据不同的场景采取合适的方法。无论是通过自然结束、标志位控制,还是通过中断机制,正确的线程管理是确保应用程序稳定和高效运行的关键。在实际开发中,避免使用不安全的强制终止方法,采用优雅的线程结束方式,并确保资源的正确释放,是编写健壮多线程应用程序的最佳实践。

Flying_Fish_roe的博客 1138

父线程结束时如何自动结束子线程

首先要指出这里的父线程不是主线程 这的确是个问题,也就是说怎么才能保证父线程结束后其子线程也都退出.有人说在父线程结束前结束掉子线程不就行了吗?但事实是,如何父线程被暴力时,根本无法正确处理子线程.个人认为有两种方法.         一是在父线程中得到句柄,创建子线程时作为参数传给子线程,这样子线程通过这个句柄可以知道父线程是否仍存活,如何已结束,则结束自身.        父线程中: H

magicyang87的专栏 3814

pthread 基础篇 结束线程

一 结束线程 1 当线程回调函数执行完后,即在回调函数中调用return语句时,默认线程终止(自然死亡) 2 显示调用pthread_exit函数(自尽^_^)。 3 调用exit函数,结束进程,也包括进程下的所有线程(地球消失了,自然活在地球上的人也就挂掉了^_^) 二 pthread_exit与return的区别 在主线程中(以main为回调函数的线程): 1· 在main

suxw80then的专栏 1722

易语言大漠多线程模板多线程结束

为了在线程结束时保证线程安全,首先采用WaitForSingleObject自然等待结束,设置了30s的等待时间,当自然结束失败时,如果等待自然线程失败,没有办法的情况下,只能强制粗暴的结束线程,同时我们对象对计数器进行恢复。 1、多线程_设置结束标志 2、多线程_结束 3、_内部结束 4、WaitForSingleObject 5、ReleaseRef 511遇见易语言多线程大漠多线程 源码: .版本 2 .支持库 EThread .子程序 多线程_设置结束标志, , , 在多线程全部结束.

511遇见 5076

如何正确地结束一个线程

为什么不用stop()方法 一般来说,当一个线程的方法体执行完,这个方法就会结束了。我们一般不直接使用stop方法来终止线程,这可能会导致业务逻辑不完整或者破坏原子性的操作,一段代码可能用来输出某些重要的信息,在方法的执行中使用stop方法终止线程,会使得输出的信息破坏或者不完整;在原子操作比如重入锁的使用时,当一个线程对象多次获得锁会使得计数加一,接下来需要以相同的次数释放锁,别的线程才能获得锁...

马一凡的博客 1万+
上一篇: Freetype2 用法
下一篇: VC 驱动器 DeviceIoControl
vrix
博客等级 码龄24年 673粉丝 167原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值