使用的版本: Delphi 7。
我正在开发一个在 Virtual ListView 上执行简单for循环的程序。数据存储在以下记录中:
type TList=record
Item:Integer;
SubItem1:String;
SubItem2:String;
end;
项目是索引。SubItem1操作的状态(成功与否)。SubItem2文件的路径。for循环加载每个文件,执行一些操作,然后保存它。操作发生在 TStringList 中。每个文件大约 2mb。
现在,如果我在主窗体上进行操作,它会完美运行。
多线程,存在巨大的内存问题。不知何故, TStringList 似乎没有被完全释放。在 3-4k 个文件之后,我得到一个 EOutofMemory 异常。有时,软件卡在 500-600mb,有时则没有。在任何情况下,TStringList 总是返回一个 EOutofMemory 异常并且不能再加载任何文件。在具有更多内存的计算机上,获取异常需要更长的时间。
其他组件也会发生同样的事情。例如,如果我使用Synapse 的THTTPSend ,那么一段时间后,软件无法创建任何新线程,因为内存消耗太高。它大约是 500-600mb,而最大应该是 100mb。在主窗体上,一切正常。
我想错误在我这边。也许我对线程的了解不够。我试图在Destroy事件中释放所有东西。我尝试了 FreeAndNil程序。我一次只尝试一个线程。我尝试手动释放线程(没有FreeOnTerminate ...)
没运气。
所以这里是线程代码。这只是基本的想法;不是所有操作的完整代码。如果我删除LoadFile prodecure,一切正常。根据线程池为每个文件创建一个线程。
unit OperationsFiles;
interface
uses Classes, SysUtils, Windows;
type
TOperationFile = class(TThread)
private
Position : Integer;
TPath, StatusMessage: String;
FileStringList: TStringList;
procedure UpdateStatus;
procedure LoadFile;
protected
procedure Execute; override;
public
constructor Create(Path: String; LNumber: Integer);
end;
implementation
uses Form1;
procedure TOperationFile.LoadFile;
begin
try
FileStringList.LoadFromFile(TPath);
// Operations...
StatusMessage := 'Success';
except
on E : Exception do StatusMessage := E.ClassName;
end;
end;
constructor TOperationFile.Create(Path : String; LNumber: Integer);
begin
inherited Create(False);
TPath := Path;
Position := LNumber;
FreeOnTerminate := True;
end;
procedure TOperationFile.UpdateStatus;
begin
FileList[Position].SubItem1 := StatusMessage;
Form1.ListView4.UpdateItems(Position,Position);
end;
procedure TOperationFile.Execute;
begin
FileStringList:= TStringList.Create;
LoadFile;
Synchronize(UpdateStatus);
FileStringList.Free;
end;
end.
可能是什么问题呢?
我一度认为,可能创建了太多线程。如果用户加载 100 万个文件,那么最终将创建 100 万个线程——尽管只有 50 个线程同时被创建和运行。
感谢您的输入。