【发布时间】:2010-01-26 06:27:03
【问题描述】:
我正在寻找一种方法来控制我在用 Delphi 编写的应用程序中创建的所有业务对象。
正如 Embarcadero 的 EDN (http://edn.embarcadero.com/article/28217) 上的一篇文章所述,基本上有三种方法可以做到这一点。我最感兴趣的是最后一个,使用接口。这样,当业务对象不再在应用程序的任何地方被引用时,它将明智地处理内存(我稍后会回到这部分)。
当创建一个新的业务对象时,明智的做法是询问那个新的对象管理器我是否已经在程序的早期获取它,从而避免从数据库中重新获取它的需要。我已经在内存中有业务对象,为什么不使用那个呢?因此,我需要内存中可用对象的列表是可搜索的(快速)。
那里提供的代码使用“TObject 数组”来存储收集到的对象,一旦达到一定数量,这对于搜索对象列表的性能并不高。我必须将其更改为 TObjectList 或某种二进制可搜索树。这里最好的选择是什么?我已经在http://www.ibrtses.com/delphi/binarytree.html 找到了一些有用的代码(我认为)。 JCL 没有关于二叉树的东西吗?
我将如何处理该树中的“业务对象”和“业务对象列表”?作为列表一部分的业务对象是否会在树中被引用两次?
关于对象的处置:我还想为该业务对象设置某种 TTL(生存时间),强制在一定时间后重新获取。 如果引用计数器下降到 0,我仍然希望将对象保留一段时间,如果程序仍然希望它在 TTL 内。这意味着我需要某种线程监视器来循环对象列表(或树)来监视要删除的对象。
我还发现了 Boehm 垃圾收集器 DLL (http://codecentral.embarcadero.com/Download.aspx?id=21646)。
简而言之,将我的“对象管理器”基于 EDN 文章中提供的源代码是否明智?我想将我的对象存储在什么样的列表中?我应该如何处理列表中的对象列表?我是否仍应将我的对象在内存中保留一段时间并由线程监视器处理它?
我的推理是否正确?在我开始编码之前有什么建议、想法或评论吗?也许一些新想法可以融入我的代码?
顺便说一句,我很乐意分享结果,让其他人受益,一旦一些聪明的头脑给出了想法。
谢谢。
【问题讨论】:
标签: delphi garbage-collection delphi-2009 delphi-2010