下面是部分代码,我要把2M大的数据加到ListView1里面,我下面的代码加小量数据是没问题的但是数量一大他就不好使了, ListView1里面要老久才显示出数据一直等到循环结束了才显示,有没有方法每循环50次后暂停把数据显示到ListView1里面后才继续循环啊?或者有什么方法优化一下让效率高点?还请高手赐教,我很菜的别见笑
var
hloopHandle3:Thandle;
dloopThreadID:DWORD ; //线程 idbegin hloopHandle := CreateThread(nil,0,@dao,nil,0,dloopThreadID);end;procedure dao;
var
aa:tlistitem;
strData:String;
strDataParse,Str1,Str2: TStringList;
begin
strData:=form1.Memo1.Text;//读取Memo1控件数据
strDataParse := TStringList.Create;
strDataParse := Split(strData,#10);//按行数分割开来
for i := 0 to strDataParse.Count-1 do
Application.ProcessMessages;
Str1 := Split(strDataParse[i],'|');//再分割
with form1.ListView1.Items.Add do
begin
Caption:= Trim(Str1[0]);
SubItems.add(Trim(Str1[1]));
end;
end;
end;
var
hloopHandle3:Thandle;
dloopThreadID:DWORD ; //线程 idbegin hloopHandle := CreateThread(nil,0,@dao,nil,0,dloopThreadID);end;procedure dao;
var
aa:tlistitem;
strData:String;
strDataParse,Str1,Str2: TStringList;
begin
strData:=form1.Memo1.Text;//读取Memo1控件数据
strDataParse := TStringList.Create;
strDataParse := Split(strData,#10);//按行数分割开来
for i := 0 to strDataParse.Count-1 do
Application.ProcessMessages;
Str1 := Split(strDataParse[i],'|');//再分割
with form1.ListView1.Items.Add do
begin
Caption:= Trim(Str1[0]);
SubItems.add(Trim(Str1[1]));
end;
end;
end;
//用不着线程
procedure Form1.doShow;
var
SrcList, tmpList : TStringList;
i, Count: Integer;
Item : TListItem;
begin
SrcList := TStringList(Memo1.Line);
tmpList := TStringList.Create;
tmpList.Delimiter := '|';
Count := SrcList.Count;
for i := 0 to Count - 1 do
begin
Application.ProcessMessages; Item := ListView1.Items.Add;
tmpList.DelimitedText := SrcList[i];
Item.Caption := Trim(tmpList[0]);
Item.SubItems.Add(Trim(tmpList[1])); //Caption := format('current:%d,count:%d',[i,Count]);
end; tmpList.Free;end;
我用线程后没卡死现象了但数据多的话还是要等很久时间才处理完,处理期间ListView1里面也不会显示出处理完的数据要等循环结束后才显示出来.
我建议你加载到内存中,而不是把它显示出来,只显示最终的结果。
我用代码测试了一个8M的文本文件,ListView 显示没用问题{
SrcList := TStringList.Create;
SrcList.LoadFromFile(' fileName.txt '); or
SrcList.Text = 'Source context'; SrcList.Free;
}
procedure Form1.doShow;
var
SrcList, tmpList : TStringList;
i, Count: Integer;
Item : TListItem;
begin
SrcList := TStringList(Memo1.Line);
tmpList := TStringList.Create;
tmpList.Delimiter := '|';
Listview1.Items.BeginUpdate;
try
Count := SrcList.Count;
for i := 0 to Count - 1 do
begin
Application.ProcessMessages;
Item := ListView1.Items.Add;
tmpList.DelimitedText := SrcList[i];
Item.Caption := Trim(tmpList[0]);
Item.SubItems.Add(Trim(tmpList[1]));
end;
finally
Listview1.Items.EndUpdate;
tmpList.Free;
end;
end;
如果还不可以,你再使用多线程。