delphi 在线程A中终止线程B

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 在线程A中终止线程B相关的知识,希望对你有一定的参考价值。

在main里定义了var:thread1:my_math1; thread2:my_math2;
在Umy_math1里引用uses Umy_math2;
var thread2:my_math2;
在Umy_math1里,想关闭线程my_math2.
thread2.terminate;
通过编译,但是运行到语句thread2.terminate时 出错。 怎么办?
还有个问题,用api通讯, closehandle(hcom[1]); 其中hcom[1]是我定义的句柄数组,当我用循环关闭句柄时用到 closehandle(hcom[i]); 就会出错,怎么办?

参考技术A 有三个解决办法。

第一个比较安全:

声明一个全局变量, 在线程2的循环过程中判断这个变量的值,如果是我们期望的值,则退出循环中止线程。

第二个方法,使用消息机制:

在线程循环中建立消息循环, 当接收到有指定的消息时退出循环中止线程。

第三个方法,直接使用API: TerminateThread

使用API TerminateThread 可以强行中止一个线程。 参考资料: http://baike.baidu.com/view/2311208.htm

参考资料:http://baike.baidu.com/view/2311208.htm

参考技术B 几个问题:
thread2中怎么实现的,my_math2基类是什么
出错是什么错误追问

thread2:=my_math2.create;
错误是:Access violation at address 00425EIC in module'project1.exe' write of address.

追答

my_math2基类是什么
楼主看来对线程了解不是太够,抓不到重点。。。
Delphi中有TThread类,可以继承这个类,并重写Execute方法
Execute方法中写线程执行的内容,执行完毕后线程会自动退出终止,因此大部分线程执行的东西是一个死循环,因此正常情况下是无法执行完毕的。然后在循环体中加一个变量的判断,TThread中就有FTerminated,当属性Terminated(FTerminated)设置为True时,就退出循环,执行结束,线程也退出终止了。而要设置FTerminated设置为True只要调用TThread的Terminate方法就可以了。
如果不是用TThread类,而是直接使用BeginThread或者CreateThread,做法也是一样的,直接在线程函数ThreadProc中加入循环和全局变量的判断,在结束线程时设置好变量让其跳出循环,线程就结束了。
当然不排除线程函数中会有类似于网络操作的阻塞函数,当网络不畅导致函数阻塞时间较长时,没法使用跳出循环的办法马上结束线程,此时就只能用TerminateThread函数来杀线程了。

本回答被提问者和网友采纳

如何正确停止线程

有三种方式可以终止线程,具体调用函数依赖于使用的线程系统。1在线程入口函数中,调用return。即退出线程入口函数,可以实现终止当前线程效果;2在线程执行的任意函数,调用当前线程退出函数,可以退出当前线程;3在任意位置,调用线程终止函数,并传入要终止线程的标识符,即pid,可以实现终止对应线程效果。 参考技术A 线程是进程中的执行体。结束线程在程序内部执行完自然会结束。
如果是代码级的停止,一般都有相应的api函数退出线程。自己可以查一下说明文档。
参考技术B 从SUN的官方文档可以得知,调用Thread.stop()方法是不安全的,这是因为当调用Thread.stop()方法时,会发生下面两件事:

1. 即刻抛出ThreadDeath异常,在线程的run()方法内,任何一点都有可能抛出ThreadDeath Error,包括在catch或finally语句中。

2. 释放该线程所持有的所有的锁

当线程抛出ThreadDeath异常时,会导致该线程的run()方法突然返回来达到停止该线程的目的。ThreadDetath异常可以在该线程run()方法的任意一个执行点抛出。但是,线程的stop()方法一经调用线程的run()方法就会即刻返回

以上是关于delphi 在线程A中终止线程B的主要内容,如果未能解决你的问题,请参考以下文章

delphi 如何在自动终止线程和手动终止线程时都正确的设置窗体上的控件

多线程 Delphi 7 App - 应用程序终止问题

使用 boost 线程:发出信号并等待终止

如何正确停止线程

安全终止MFC线程

Delphi多线程怎么处理?