数据导入问题,多线程高手请进!见者有分。 (200分)

  • 主题发起人 主题发起人 zzybbs
  • 开始时间 开始时间
Z

zzybbs

Unregistered / Unconfirmed
GUEST, unregistred user!
有一组几十万个的数据存储于文本文件中,想把它导入ListView中,速度奇慢,
如何用多线程技术将它一个不漏地导入,并可动态的改变线程的数目?
最好是有代码说明。急切期待高手们的回应!
 
导入ListView?不可思议。有必要吗?
 
将文本文件当成文本型的数据库来处理。
 
--> 数据库不是更好吗?
 
如果是数据纪录,先到入数据库
如果上述可行,在讨论
 
我也觉得是在折磨PC
 
不要说几十万个,就是几千个放入List中的价值是什么?使用者没有三头六臂!
 
呵呵,如果想提高效率,那就用 stringGrid来代替TListView
用多线程效率提高不了多少,速度还要慢一些,就是系统在添
加过程中不在停止相应。。。
 
谢谢各位大富翁的捧场,暂且先不讨论问题的可行性,问题的关键在于如何对于一个长循
环进行多线程处理,并动态的改变线程的数目,就象下载软件动态改变线程一个样,再次
期待各位前辈的的答复,谢谢!
 
建一个Thread,在需要用的地方调用该线程序。
 
>>动态的改变线程的数目
创建就增加,释放就减少嘛,难道用惯了控件,这个都不会啊!
 
有没搞错,多线程只是在后台利用,对于ListView是没有线程安全性了,所以还是由CPU
时间片内来完成加载啊,这里多线程怎么用得上呢?
 
给你参考
下面是我用线程一次性加如全部记录。你完全可以仿照我下面的做法。
分段你自己控制一下就可以了。
uses activex;
private
Procedure AddDataToDB;
public
end;

TTimerThread = class(TThread)
procedure Execute;
override;
end;

var
form1: Tform1;
Thread1:TTimerThread;
implementation;

procedure TTimerThread.Execute;
begin
Priority := tpNormal;
freeonterminate:=true;
CoInitialize(Nil);
try
form1.AddDataToDB;
finally
CoUninitialize;
end;
end;
Procedure tform1.AddDataToDB;
var i:integer;
begin
With clientdataset2do
begin
close;
commandtext:='select * from table where 1=2';
open;
clientdataset1.first;
for i=1 to clientdataset1.recordcountdo
begin
append;
fieldbyname('field1').asstring:=clientdataset1.fieldbyname('filed1').asstring;
fieldbyname('field2').asstring:=clientdataset1.fieldbyname('filed2').asstring;
....
post;
clientdataset1.next;
end;
clientdataset2.ApplyUpdates(-1);//这句话会把20000记录 一次性的保存到数据库
end;
end;
Procedure tform1.button1Onclick(Sender: TObject);
begin
Thread1:=TTimerThread.Create(false);
end;


 
开那么多线程速度肯定要下降,还不如直接用主线程速度快了。。。中间加上
Application.Pr*****Message就行了,
 
分段导入吧。先预测一下用户会看到哪段数据,然后显示在listview中。
你可以参考delphi的ide,她的文本编辑区可以打开16m以上的文件,并且速度飞快。
 
你现在连多线程的作用都没有搞清楚。
多线程是不能提高计算机的运行速度的(不包含超线程的CPU)
应用多线程主要是为了计算机能够在同意时刻做几件不同的事情。(只是表面上的)
计算机把时间分成很多很小时间片,同一时刻只能有一个进程中的一个线程执行,
只是这个时间片很小,所以看起来就像大家一起工作。
对于《网络蚂蚁》和《网际快车》这样的网络下载工具,根本不能占用很多的CPU,
只是它又向服务器发送了一个连接请求,服务器把它当作一个单独的请求来处理,
所以下载速度能够加快。实质只是加快了网络的传输速度,根本没有提高CPU的效率。
所以你的这个方案根本行不通!
而且你要用ListView这样的递归控件,其速度真的不敢恭维。
还是用StringGrid的这样简单控件,然后定义一个记录的数组类。
这样可能就是目前最可行的方法。
呵呵,错误之处还请各位富翁指出。
 
是多线程的协调问题吧,就象网络蚂蚁下载文件一样,先设总数目个数组,
再根据线程数目等份处理,直到所有记录标志都变成已处理
 

Similar threads

S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
后退
顶部