terminatethreaddelphi多线程为什么无法用TerminateThread结束线程

terminatethread  时间:2021-07-16  阅读:()

如何终止线程的运行(C/C++)

想要终止线程的运行,可以使用以下方法: 1、线程函数返回(最好使用该方法)。

2、通过调用ExitThread函数,线程将自行撤消(最好不使用该方法)。

3、同一个进程或另一个进程中的线程调用TerminateThread函数(应避免使用该方法)。

4、ExitProcess和TerminateProcess函数也可以用来终止线程的运行(应避免使用该方法)。

下面将详细介绍终止线程运行的方法:1-4,并说明线程终止运行时会出现何种情况:5。

1、线程函数返回 始终都应62616964757a686964616fe4b893e5b19e31333332633037该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。

这是确保所有线程资源被正确地清除的唯一办法。

如果线程能够返回,就可以确保下列事项的实现: (1)在线程函数中创建的所有C++对象均将通过它们的撤消函数正确地撤消。

(2)操作系统将正确地释放线程堆栈使用的内存。

(3)系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。

(4)系统将递减线程内核对象的使用计数。

2、ExitThread函数 可以让线程调用ExitThread函数,以便强制线程终止运行: 函数原型:VOID ExitThread(DWORD dwExitCode); 该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。

但是,C++资源(如C++类对象)将不被撤消。

由于这个原因,最好从线程函数返回,而不是通过调用ExitThread来返回。

当然,可以使用ExitThread的dwExitThread参数告诉系统将线程的退出代码设置为什么。

ExitThread函数并不返回任何值,因为线程已经终止运行,不能执行更多的代码。

注意终止线程运行的最佳方法是让它的线程函数返回。

但是,如果使用本节介绍的方法,应该知道ExitThread函数是Windows用来撤消线程的函数。

如果编写C/C++代码,那么决不应该调用ExitThread。

应该使用Visual C++运行期库函数_endthreadex。

如果不使用Microsoft的Visual C++编译器,你的编译器供应商有它自己的ExitThread的替代函数。

不管这个替代函数是什么,都必须使用。

3、TerminateThread函数 调用TerminateThread函数也能够终止线程的运行: 函数原型:BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode); 与ExitThread不同,ExitThread总是撤消调用的线程,而TerminateThread能够撤消任何线程。

hThread参数用于标识被终止运行的线程的句柄。

当线程终止运行时,它的退出代码成为你作为dwExitCode参数传递的值。

同时,线程的内核对象的使用计数也被递减。

注意TerminateThread函数是异步运行的函数,也就是说,它告诉系统你想要线程终止运行,但是,当函数返回时,不能保证线程被撤消。

如果需要确切地知道该线程已经终止运行,必须调用WaitForSingleObject或者类似的函数,传递线程的句柄。

设计良好的应用程序从来不使用这个函数,因为被终止运行的线程收不到它被撤消的通知。

线程不能正确地清除,并且不能防止自己被撤消。

注意当使用返回或调用ExitThread的方法撤消线程时,该线程的内存堆栈也被撤消。

但是,如果使用TerminateThread,那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。

Microsoft故意用这种方法来实现TerminateThread。

如果其他仍然正在执行的线程要引用强制撤消的线程堆栈上的值,那么其他的线程就会出现访问违规的问题。

如果将已经撤消的线程的堆栈留在内存中,那么其他线程就可以继续很好地运行。

此外,当线程终止运行时, DLL通常接收通知。

如果使用TerminateThread 强迫线程终止,DLL就不接收通知,这能阻止适当的清除。

4、在进程终止运行时撤消线程 ExitProcess和TerminateProcess函数也可以用来终止线程的运行。

差别在于这些线程将会使终止运行的进程中的所有线程全部终止运行。

另外,由于整个进程已经被关闭,进程使用的所有资源肯定已被清除。

这当然包括所有线程的堆栈。

这两个函数会导致进程中的剩余线程被强制撤消,就像从每个剩余的线程调用TerminateThread一样。

显然,这意味着正确的应用程序清除没有发生,即C++对象撤消函数没有被调用,数据没有转至磁盘等等。

5、线程终止运行时发生的操作 当线程终止运行时,会发生下列操作: (1)线程拥有的所有用户对象均被释放。

在Windows中,大多数对象是由包含创建这些对象的线程的进程拥有的。

但是一个线程拥有两个用户对象,即窗口和挂钩。

当线程终止运行时,系统会自动撤消任何窗口,并且卸载线程创建的或安装的任何挂钩。

其他对象只有在拥有线程的进程终止运行时才被撤消。

(2)线程的退出代码从STILL_ACTIVE改为传递给ExitThread或TerminateThread的代码。

(3)线程内核对象的状态变为已通知。

(4)如果线程是进程中最后一个活动线程,系统也将进程视为已经终止运行。

(5)线程内核对象的使用计数递减1。

当一个线程终止运行时,在与它相关联的线程内核对象的所有未结束的引用关闭之前,该内核对象不会自动被释放。

一旦线程不再运行,系统中就没有别的线程能够处理该线程的句柄。

然而别的线程可以调用GetExitcodeThread来检查由hThread标识的线程是否已经终止运行。

如果它已经终止运行,则确定它的退出代码: 函数原型:BOOL GetExitCodeThread( HANDLE hThread, PDWORD pdwExitCode); 退出代码的值在pdwExitCode指向的DWORD中返回。

如果调用GetExitCodeThread时线程尚未终止运行,该函数就用STILL_ACTIVE标识符(定义为0x103)填入DWORD。

如果该函数运行成功,便返回TRUE。

易语言结束线程怎么写

易语言的多线程支持库中有 强制结束线程 () 调用格式: 〈逻辑型〉 强制结束线程 (整数型 线程句柄) - 多线程支持库-多线程控制 英文名称:TerminateThread 返回真表示执行成功。

本命令为初级命令。

参数<1的名称为“线程句柄”,类型为“整数型(int)”。

可通过“启动线程”的第三个参数获取线程句柄。

操作系统需求: Windows、Linux

易语言线程随时开始与结束怎么写 就是我按登陆就出现一个登陆画面同时启动线程,当按取消的时候结束线程

如果整个程序关掉重来就正常了?感觉线程有资源冲突,可以尝试一下易语言线程部分许可证机制。

这问题有点空。

建议在特殊位置(如线程任务结束的点)插入测试代码,弹出对话框或者改变变量值来判断问题出在哪一部分。

再来提问会有效得多。

delphi多线程为什么无法用TerminateThread结束线程

释放线程最好用一下方法: FThread.Terminate; FThread.Resume; FThread.Free; FThread := nil;

金山云:618年中促销,企业云服务器2核4G仅401.28元/年,827.64元/3年

金山云618年中促销活动正在进行中!金山云针对企业级新用户优惠力度比普通个人用户优惠力度要大,所以我们也是推荐企业新用户身份购买金山云企业级云服务器,尽量购买3年配置的,而不是限时秒杀活动中1年的机型。企业级用户购买金山云服务器推荐企业专区:云服务器N3 2核4G云服务器,1-5M带宽,827.64元/3年,性价比高,性能稳定!点击进入:金山云618年中促销活动目前,金山云基础型E1云服务器2核4...

HostMem,最新优惠促销,全场75折优惠,大硬盘VPS特价优惠,美国洛杉矶QuadraNet机房,KVM虚拟架构,KVM虚拟架构,2核2G内存240GB SSD,100Mbps带宽,27美元/年

HostMem近日发布了最新的优惠消息,全场云服务器产品一律75折优惠,美国洛杉矶QuadraNet机房,基于KVM虚拟架构,2核心2G内存240G SSD固态硬盘100Mbps带宽4TB流量,27美元/年,线路方面电信CN2 GT,联通CU移动CM,有需要美国大硬盘VPS云服务器的朋友可以关注一下。HostMem怎么样?HostMem服务器好不好?HostMem值不值得购买?HostMem是一家...

Cloudxtiny:£1.5/月,KVM-512MB/100GB/英国机房

Cloudxtiny是一家来自英国的主机商,提供VPS和独立服务器租用,在英国肯特自营数据中心,自己的硬件和网络(AS207059)。商家VPS主机基于KVM架构,开设在英国肯特机房,为了庆祝2021年欧洲杯决赛英格兰对意大利,商家为全场VPS主机提供50%的折扣直到7月31日,优惠后最低套餐每月1.5英镑起。我们对这场比赛有点偏见,但希望这是一场史诗般的决赛!下面列出几款主机套餐配置信息。CPU...

terminatethread为你推荐
ISDNisdn是什么意思weakhashmapJava///map的父类是?备忘录模式为什么我的华为手机界面总是有个框框在备忘录上面jdk6JDK6和JDK7两个版本有什么区别,初学者选那个好?调度系统操作系统中为什么需要调度?radius认证PPPoE有认证的功能,RADIUS也有验证功能,两者有区别么??民生电商民生电商是民生银行吗?手机建设银行网址建设银行个人网上银行使用手机浏览器访问没有登录入口。菜霸电视剧《你是我的生命》演员表杭州营销型网站苏州网站推广有哪些?
免费国内空间 万网域名查询 域名注册godaddy 二级域名查询 如何查询域名备案号 sharktech 罗马假日广场 海外服务器 国内永久免费云服务器 流媒体服务器 轻博客 国内php空间 台湾谷歌网址 免费网站申请 速度云 美国网站服务器 idc查询 银盘服务是什么 银盘服务 双线asp空间 更多