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]); 就会出错,怎么办? 展开
在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]); 就会出错,怎么办? 展开
2个回答
展开全部
有三个解决办法。
第一个比较安全:
声明一个全局变量, 在线程2的循环过程中判断这个变量的值,如果是我们期望的值,则退出循环中止线程。
第二个方法,使用消息机制:
在线程循环中建立消息循环, 当接收到有指定的消息时退出循环中止线程。
第三个方法,直接使用API: TerminateThread
使用API TerminateThread 可以强行中止一个线程。 参考资料: http://baike.baidu.com/view/2311208.htm
第一个比较安全:
声明一个全局变量, 在线程2的循环过程中判断这个变量的值,如果是我们期望的值,则退出循环中止线程。
第二个方法,使用消息机制:
在线程循环中建立消息循环, 当接收到有指定的消息时退出循环中止线程。
第三个方法,直接使用API: TerminateThread
使用API TerminateThread 可以强行中止一个线程。 参考资料: http://baike.baidu.com/view/2311208.htm
参考资料: http://baike.baidu.com/view/2311208.htm
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
几个问题:
thread2中怎么实现的,my_math2基类是什么
出错是什么错误
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函数来杀线程了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询