delphi – 在关闭应用程序时终止所有线程(TThread)
发布时间:2020-12-15 09:43:49 所属栏目:大数据 来源:网络整理
导读:我的应用程序是一个tcp / ip服务器,主线程只创建一次一直在听.当新客户端连接时,主线程创建TClientThread类型的新线程.但是没有运行客户端线程的列表,因为这会使我的应用程序有点复杂…有没有办法在所有线程上执行“terminate”方法,即使线程忙(在我的情况下
我的应用程序是一个tcp / ip服务器,主线程只创建一次&一直在听.当新客户端连接时,主线程创建TClientThread类型的新线程.但是没有运行客户端线程的列表,因为这会使我的应用程序有点复杂…有没有办法在所有线程上执行“terminate”方法,即使线程忙(在我的情况下“忙”)意味着它正在等待数据,超时设置大约是30秒……所以无论如何我都要杀掉它,而不是等待.)?
简单的关闭应用程序似乎不会在线程上运行“terminate”方法,最终会导致FastMM报告内存泄漏… 解决方法
关机时的内存泄漏无需担心 – 在将控制权返回到操作系统之前解决内存泄漏的麻烦是浪费时间并且不必要地减慢应用程序退出的速度.您真正需要做的就是确保已保存所有数据,并正确释放所有进程间句柄(如信号量和互斥量),然后退出.
为了通知客户,您可以做的最好的策略是这样的策略: >将所有客户端处理线程添加到某个列表中(在创建,销毁和迭代时具有适当的锁定)>终止时使客户端线程从列表中删除,并且如果服务器正在关闭,则从列表中删除最后一项将设置事件(手动重置事件,例如SyncObjs中的TEvent)>引入轮询(例如选择或等效超时)或其他类型的中断(例如SO_RCVTIMEO / SO_SNDTIMEO),否则将是长时间运行的阻塞例程,监视Terminated属性>关闭时,锁定列表并遍历它,调用Terminate,然后等待事件发出信号;当然,在遍历列表之前,应该关闭将列表添加到列表中的侦听套接字并且已知它是已关闭的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |