下面是一段我用线程添加数据到数据库的程序。在添加数据的时候需要设置进度条。但是在第一次执行这个线程的时候没有问题,如果,不重新新启动程序,第二次执行时,只能执行几次循环。(正常情况是2000多次循环)unit AddDataThread;interfaceuses
Classes;type
TAddDataThread = class(TThread)
private
_cnt:integer;
_LastDate:TDateTime;
_errorcount:integer;
_okcount:integer;
protected
procedure UpdateProressBar;
procedure UpdateMainForm;
procedure Execute; override;
//procedure Create;override;
public
property ProcedureRecordCount:integer read _cnt write _cnt;
property LastDate:TDateTime read _LastDate write _LastDate;
end;implementation
uses SysUtils,UMain, Dialogs;//procedure TAddDataThread.Create;override;
//begin
//end;
procedure TAddDataThread.UpdateProressBar;
begin
if (GSLinkForm.ProgressBar.Position = GSLinkForm.ProgressBar.Max - 1) then
begin
GSLinkForm.Label1.Caption := '本次采集数据:' + IntToStr(_okcount) + '/' + IntToStr(GSLinkForm.ProgressBar.Max) + ' 条。';
GSLinkForm.Label1.Update;
GSLinkForm.Panel1.Visible := false;
GSLinkForm.RZQuery.AppendRecord([now,_okcount]);
end else
begin
GSLinkForm.ProgressBar.StepIt;
GSLinkForm.Label1.Caption := '正在采集数据......(' + IntToStr(_okcount) + '/' + IntToStr(GSLinkForm.ProgressBar.Max) + ')';
end;
end;
procedure TAddDataThread.Execute;
var
i:integer;
begin
self._errorcount := 0;
self._okcount := 0;
for i := 0 to _cnt - 1 do
begin
try
if (self.Terminated) then break;
Synchronize(UpdateMainForm);
Synchronize(UpdateProressBar);
except
//if not(ExceptObject is EAbort) then
// Synchronize(HandleThreadException);
end;
end;
end;procedure TAddDataThread.UpdateMainForm;
var
i:integer;
begin
try
try
GSLinkForm.DataQuery.Append;
for i := 0 to GSLinkForm.XMLDataTable.Fields.Count - 1 do
begin
GSLinkForm.DataQuery.FieldList.Fields[i].Value := GSLinkForm.XMLDataTable.FieldList.Fields[i].Value;
end;
GSLinkForm.DataQuery.Post; _okcount := _okcount + 1;
except on e:Exception do
begin
self._errorcount := _errorcount + 1;
GSLinkForm.DataQuery.Delete;
end;
end;
finally
GSLinkForm.XMLDataTable.Next;
end;
end;end.
Classes;type
TAddDataThread = class(TThread)
private
_cnt:integer;
_LastDate:TDateTime;
_errorcount:integer;
_okcount:integer;
protected
procedure UpdateProressBar;
procedure UpdateMainForm;
procedure Execute; override;
//procedure Create;override;
public
property ProcedureRecordCount:integer read _cnt write _cnt;
property LastDate:TDateTime read _LastDate write _LastDate;
end;implementation
uses SysUtils,UMain, Dialogs;//procedure TAddDataThread.Create;override;
//begin
//end;
procedure TAddDataThread.UpdateProressBar;
begin
if (GSLinkForm.ProgressBar.Position = GSLinkForm.ProgressBar.Max - 1) then
begin
GSLinkForm.Label1.Caption := '本次采集数据:' + IntToStr(_okcount) + '/' + IntToStr(GSLinkForm.ProgressBar.Max) + ' 条。';
GSLinkForm.Label1.Update;
GSLinkForm.Panel1.Visible := false;
GSLinkForm.RZQuery.AppendRecord([now,_okcount]);
end else
begin
GSLinkForm.ProgressBar.StepIt;
GSLinkForm.Label1.Caption := '正在采集数据......(' + IntToStr(_okcount) + '/' + IntToStr(GSLinkForm.ProgressBar.Max) + ')';
end;
end;
procedure TAddDataThread.Execute;
var
i:integer;
begin
self._errorcount := 0;
self._okcount := 0;
for i := 0 to _cnt - 1 do
begin
try
if (self.Terminated) then break;
Synchronize(UpdateMainForm);
Synchronize(UpdateProressBar);
except
//if not(ExceptObject is EAbort) then
// Synchronize(HandleThreadException);
end;
end;
end;procedure TAddDataThread.UpdateMainForm;
var
i:integer;
begin
try
try
GSLinkForm.DataQuery.Append;
for i := 0 to GSLinkForm.XMLDataTable.Fields.Count - 1 do
begin
GSLinkForm.DataQuery.FieldList.Fields[i].Value := GSLinkForm.XMLDataTable.FieldList.Fields[i].Value;
end;
GSLinkForm.DataQuery.Post; _okcount := _okcount + 1;
except on e:Exception do
begin
self._errorcount := _errorcount + 1;
GSLinkForm.DataQuery.Delete;
end;
end;
finally
GSLinkForm.XMLDataTable.Next;
end;
end;end.
解决方案 »
- 如何把wav合成到一个没有声音的avi
- 执行Dataset.Insert;方法之后 未提交前 如何得到插入的位置
- 怎样在代码中控制DBGrid中的光标位置?
- 我已经完成了一个数据库系统,我该如何打包,让vc调用(com?or dll?如何做?)
- 为什么我的报表内容和数据源的不统一?:((急急急---我都要哭了。。。
- 如何控制扫描仪,并且将扫描后的图像按指定大小存入数据库指定字段 。请问如何做到...
- 最近做了一个,淘宝自动发货软件,自动发卡,自动评价,(E速达)欢迎大家提提意见
- 如何用Client Socket和Server Socket传送图片?
- 有没这样的控件?
- 有关Delphi消息处理机制的问题
- ▓▓▓请问怎么用delphi获取网页中嵌入的Meaiaplayer的URL值?▓▓▓
- 有关字段显示问题
GSLinkForm.XMLDataTable.Next;
end;
這句不明白, 好象是多餘的
GSLinkForm.XMLDataTable.Next;
end;
是将原数据表中的记录指针向下移动。一边读取下移条记录,插入到数据库中。
这个程序如果不用线程,是一点问题都没有的。而之所以用线程是因为在处理大数据量的时候UI没有反应。好像死机一样。