下面是部分代码,我要把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;

解决方案 »

  1.   


    //用不着线程
    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;
      

  2.   

    看你的代码比我的清晰多了高手和菜鸟的差别就是大,感谢你的热心,呵呵但是我试过不用线程的话如果Memo1的数据太多就会卡死程序,最多只能导入百多条,1多就死程序
    我用线程后没卡死现象了但数据多的话还是要等很久时间才处理完,处理期间ListView1里面也不会显示出处理完的数据要等循环结束后才显示出来.
      

  3.   

    Memo显示2M的数据肯定会慢,只是由于GDI造成的。
    我建议你加载到内存中,而不是把它显示出来,只显示最终的结果。
    我用代码测试了一个8M的文本文件,ListView 显示没用问题{
      SrcList := TStringList.Create;
      SrcList.LoadFromFile(' fileName.txt '); or
      SrcList.Text = 'Source context';  SrcList.Free;
    }
      

  4.   

    你可以使用BeginUpdate和EndUpdate
    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;
    如果还不可以,你再使用多线程。