delphi 在线程A中终止线程B

在main里定义了var:thread1:my_math1;thread2:my_math2;在Umy_math1里引用usesUmy_math2;varthread2:... 在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]); 就会出错,怎么办?
展开
 我来答
我是大白大白的大大白的白
2011-11-11 · 超过45用户采纳过TA的回答
知道小有建树答主
回答量:168
采纳率:0%
帮助的人:54.3万
展开全部
有三个解决办法。

第一个比较安全:

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

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

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

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

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

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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lake_cx
2011-11-11 · TA获得超过166个赞
知道小有建树答主
回答量:209
采纳率:0%
帮助的人:176万
展开全部
几个问题:
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函数来杀线程了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式