多线程 加载内容

kyoo_1985 2009-09-21 10:17:07
有50W的数据(就一个数据:金额),需要加载到一个listView中去,想用多线程来做。怎么弄呀?没有整过哎。

我是先从文件中读取数据到了一个StringList中,然后循环,一个一个的加入到listView的,50W要10分钟才行,晕死我了。

大家有没有好的方法呀~~~~
...全文
77 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kyoo_1985 2009-11-07
  • 打赏
  • 举报
回复
谢谢楼上各位了。结贴吧,我还是按照自己的方法做的~~~
Hexpate 2009-09-22
  • 打赏
  • 举报
回复
Listview 效率本来就不高. 看了你的代码, 其实关于Ui的部分是需要同步执行的, 代码上看优化的空间好像不大了, 不知道你有没有用过TVirtualStringTree,他添加100w条的数据非常的快.也许很适合你的要求,你可以尝试一下.
flymoon99 2009-09-22
  • 打赏
  • 举报
回复
本来想给你写的全一些- -!可惜只有20分。给你个提示,重载OnData事件,自己处理数据。因为他只是加载需要显示的部分,你一页面能显示100条也就是加载100条的时间。真正耗时的是在TStringList的加载时间上。不过加载50万数据也就10来秒。
iqyely 2009-09-22
  • 打赏
  • 举报
回复
来关注下。
ZyxIp 2009-09-22
  • 打赏
  • 举报
回复
业务设计上就有问题,这么多数据加载到列表中有什么用!!!

每次加200条足够了,其它的用分页来显示。
kyoo_1985 2009-09-21
  • 打赏
  • 举报
回复
try
phoneCount := phoneStringList.Count;
//Randomize;
if phoneCount > 0 then
begin
wNum := phoneCount div importCount;
left := phoneCount mod importCount;
importThread1 := importThread.Create(false);
{lvPhone.Items.BeginUpdate;
for i := 0 to phoneStringList.Count - 1 do
begin
tmp := phoneStringList.Strings[i];
li := lvPhone.Items.Add;
li.Caption := tmp;
li.SubItems.Add('');
//randomNum := 10+random(10);
//li.SubItems.Add(IntToStr(randomNum)+':发送成功');
li.SubItems.Add('');
end;
lvPhone.Items.EndUpdate;}
//显示号码条数
StatusBar1.Panels[0].Text := '共有'+IntToStr(phoneCount)+'个客户号码';
end;
finally
//FreeAndNil(phoneStringList);
end;
注释部分是我以前用的方法,很慢。


procedure importThread.Execute;
var
i, j, k:Integer;
randomNum : Integer;
li: TListItem;
tmp: String;
begin
SetName;
FreeOnTerminate := true;
Randomize;
if Form1.wNum > 0 then
begin
for i := 0 to Form1.wNum-1 do
begin
Form1.lvPhone.Items.BeginUpdate;
for j := Form1.importCount*i to Form1.importCount*(i+1)-1 do
begin
tmp := Form1.phoneStringList.Strings[j];
li := Form1.lvPhone.Items.Add;
li.Caption := tmp;
li.SubItems.Add('');
randomNum := 10+random(10);
li.SubItems.Add(IntToStr(randomNum)+':发送成功');
li.SubItems.Add('');
end;
Form1.lvPhone.Items.EndUpdate;
end;
end
else if Form1.left > 0 then
begin
Form1.lvPhone.Items.BeginUpdate;
for k := 0 to Form1.left-1 do
begin
tmp := Form1.phoneStringList.Strings[k];
li := Form1.lvPhone.Items.Add;
li.Caption := tmp;
li.SubItems.Add('');
randomNum := 10+random(10);
li.SubItems.Add(IntToStr(randomNum)+':发送成功');
li.SubItems.Add('');
end;
Form1.lvPhone.Items.EndUpdate;
end;

{ Place thread code here }
end;

现在用的是线程,每500条(可以配置)来加载,页面可以显示,但是会一直加载,还是很慢...
sparklerl 2009-09-21
  • 打赏
  • 举报
回复
做翻页吧 看多少加多少,50W加进去也没用啊
Hexpate 2009-09-21
  • 打赏
  • 举报
回复
能贴代码吗,贴出来这样比较好解决问题
kyoo_1985 2009-09-21
  • 打赏
  • 举报
回复
恩,谢谢楼上的。你说的我试过了,还是非常慢....
我是一边展示一边在显示的,哈哈。但是我的那个线程好像很慢...
Hexpate 2009-09-21
  • 打赏
  • 举报
回复
你先在加载listview的时候执行listview.Items.BeginUpdate; 多线程也是最后要同步到主线程进行添加的,这样对你好像没多大作用,毕竟你的数据都已经加载到StringList中了,除非你能接收运行时界面上的listview还在不断的加载数据,其实打开listview.Items.BeginUpdate会对你有很大的帮助,你先测试一下,不行在用多线程解决.

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧