当前位置:  开发笔记 > 程序员 > 正文

如何优雅地停止长时间执行线程?

如何解决《如何优雅地停止长时间执行线程?》经验,为你挑选了1个好方法。

我有Delphi的线程问题.我想这在其他语言中也很常见.我有一个很长的过程,我在一个线程中,填充主窗口中的列表.但是如果某些参数在平均时间内发生变化,那么我应该停止当前正在执行的线程并从头开始.Delphi建议通过设置Terminated:= true来终止线程,并在线程中检查此变量的值.但是我的问题是这个,长的执行部分被埋在库调用中,在这个调用中我无法检查Terminated变量.因此我不得不等待这个库调用完成,这会影响整个程序.

在这种情况下,首选的方法是什么?我可以立即杀死线程吗?



1> Barry Kelly..:

首选方法是修改代码,使其在不检查取消的情况下不会阻塞.

既然你不能修改代码,你就不能这样做; 你要么必须使用后台操作(但你可以将它与任何UI取消关联,以便它的完成将被忽略); 或者,您可以尝试终止它(TerminateThread API将粗暴地终止给定其句柄的任何线程).但是,终端并不干净,就像Rob说的那样,线程所持有的任何锁都将被放弃,并且受此类锁保护的任何跨线程状态都可能处于损坏状态.

你能考虑在单独的可执行文件中调用该函数吗?也许使用RPC(管道,TCP,而不是共享内存,因为相同的锁定问题),以便您可以终止进程而不是终止线程?进程隔离将为您提供更好的保护.只要你不依赖于跨进程命名的东西,比如互斥,它应该比杀死一个线程更安全.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有