项目遇到最大的困境,也不知道何去何从。
写了好几个月,收尾阶段了,本来以为可以结束了
结果遇到了问题 实在无法解决。代码还算有点大,接近1W5行的样子
问题出在了使用了泛型list,里面都是存储结构体
然后大量的在调用过程中使用,调用过程又都是在线程里面。
线程要多次 启动和结束,每次启动和结束的时候都会发现内存一下子上去了,然后在线程运行中会发现内存也是缓慢增加的。用了工具定位,全部都定位到泛型list创建的位置,查了一下资料。有可能有几种原因。也不确定。(delphi2010)
1、泛型list里面的结构体是有string类型的,释放不干净,这个也不知道怎么处理。
2、泛型list在过程里面调用了clear方法,没有释放对象(这个我做过实验,貌似内存没增长)
3、泛型list本身就有问题,是一个编译器bug,需要版本更新。
4、我代码本身的问题,有些地方没释放,但是我是窗体创建的时候创建,窗体销毁的时候free的,最后也没提示内存泄露啊。在中间过程的内存不断上涨(多线程 启动之后 内存先增加再减少,然后稳定,线程结束之后重新启动 内存一下子增加了好多。中间我都是用clear去清理的不知道是不是这个原因)
5、问了论坛的一些朋友 一般给的代码都是 创建没多久就销毁了,问题是我的程序需要创建 之后 在线程里面多次操作
线程也是多次的 启动 退出 最后程序完全退出的时候才退出。(这样的话 借用别人的话来说 就是要考虑生命周期的问题)可是我不会处理
经过这几个月的代码编写,我深深的感到了delphi 程序员的无奈 资料很难找 问了之后 即使有回答的 也是要自己重新摸索好久。有些底层的东西 要自己处理 处理不好 往往问题很大。
诶,好多天没好好休息了。有愿意聊的,说个话。
聊的开心的就当散分吧。 多线程 内存 泛型
[解决办法]
对于某个特定类型就写个对应的代理类,类中包含一个私有的TList:
TSOList = class
private
FList: TList;
public
procedure Add(so: Tso);
procedure Delete(i: integer);
procedure Insert(i: integer;so: TSO);
procedure Clear;
contructor Create;
destructor Destroy; override;
end;
constructor TSOList.Create;
begin
FList := TList.Create;
end;
destructor TSOList.Destroy;
begin
FList.Free;
inherited;
end;
procedure TSOList.Add(so: TSO);
begin
FList.Add(@so);
//这里相当于一个代理操作,下面几个类似,我便不重复叙述了
end;
这种方法我用了很久,虽说有些麻烦,但还是很安全。当你要用的数据结构并不多时,可以考虑