gpt4 book ai didi

delphi - 在关闭应用程序时终止所有线程(TThread)

转载 作者:行者123 更新时间:2023-12-03 15:15:24 27 4
gpt4 key购买 nike

我的应用程序是一个 tcp/ip 服务器,主线程仅创建一次并始终监听。当新的客户端连接时,主线程创建TClientThread类型的新线程。但是,没有正在运行的客户端线程的列表,因为这会使我的应用程序有点复杂...有没有办法在所有线程上执行“终止”方法,即使线程很忙(在我的情况下“忙”)意味着它正在等待数据,其中超时设置约为 30 秒...所以我无论如何都必须杀死它,而不需要等待。)?简单的关闭应用程序似乎没有在线程上运行“终止”方法,这最终导致 FastMM 报告内存泄漏...

最佳答案

关闭时的内存泄漏无需担心 - 在将控制权返回给操作系统之前释放内存的麻烦是浪费时间并且不必要地减慢应用程序的退出速度。您真正需要做的就是确保所有数据已保存,所有进程间句柄(例如信号量和互斥体)已正确释放,然后退出。

为了通知客户,您能做的最好的策略就是像这样的策略:

  • 将所有客户端处理线程添加到某个列表中的某个位置(对创建、销毁和迭代进行适当的锁定)
  • 使客户端线程在终止时将自身从列表中删除,并在服务器关闭时从列表中删除的最后一项设置一个事件(手动重置事件,例如 SyncObjs 中的 TEvent)
  • 在长时间运行的阻塞例程中引入轮询(例如 select 或具有超时功能的等效项)或其他类型的中断(例如 SO_RCVTIMEO/SO_SNDTIMEO),监视 Termminate 属性
  • 关闭时,锁定列表并迭代它,调用 Terminate ,然后等待事件发出信号;当然,向列表添加项目的监听套接字应该关闭,并且在迭代列表之前应该关闭该监听套接字

关于delphi - 在关闭应用程序时终止所有线程(TThread),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1203185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com