我是在主线程里开了个线程对一个很大的表(100M)进行处理
启动线程的代码是:
procedure TForm1.btnStartClick(Sender: TObject);
begin
//DeleteInvalid;
if ((sOldFileName = '') or (not fileExists(sDir + '\' + sOldFileName)))then begin
IniCheckPath;
end;
if ((sOldFileName = '') or (not fileExists(sDir + '\' + sOldFileName)))then begin
Messagebox(handle, '数据表路径不对,请先选择文件。', '警告', MB_OK + MB_ICONERROR);
exit;
end;
if (MessageBox(handle, '先排序吗?按确定先排序,按取消不排序。', '提示', MB_OKCANCEL +MB_ICONINFORMATION) = ID_OK) then
SortFlag := true
else
SortFlag := false;
btnStop.Enabled := true;
btnResult.Enabled := false;
btnStart.Enabled := false;
btnSelect.Enabled := false;
btnSetWord.Enabled := false;
btnExit.Enabled := false;
trdCheck := TCheckThread.Create; //创建查错线程
//Edit1.Text := datetimetoStr(now);
with trdCheck do
OnTerminate := ThreadDone;
end;线程结束后的操作是这样的
procedure TForm1.ThreadDone(Sender :TObject);
var
i :integer;
mytextfile:textfile;
sErrorFile : String;
pNewTemp :pCallingRec;
begin
ModifyToOld;//改回字段名
sErrorFile := sCurrentDir + 'Error.txt';
assignfile(mytextfile, sErrorFile);
if fileexists(sErrorFile) then
deletefile(sErrorFile);
rewrite(mytextfile);
try
writeln(mytextfile, '记录号 ', ' 主叫 ',' 开始日期 ', ' 开始时间 ', ' 时长');
pNewTemp := pError;
i := 1;
while pNewTemp <> nil do
begin
with pNewTemp^ do
begin
if i Mod 2 <> 0 then
writeln(mytextfile);
writeln(mytextfile, ' '+ IntToStr(iRecNo) + ' ', IntToStr(iCalling) + ' ', ' '+copy(sBeginTime, 1, 4) + ' ', copy(sBeginTime, 5, 10)+ ' ', inttoStr(iDuration));
end;
pNewTemp := pNewTemp.pNext;
Inc(i);
end;
pNewTemp := pError;
while pNewTemp <> nil do
begin
pNewTemp := pNewTemp.pNext;
Dispose(pError);
pError := pNewTemp;
end;
finally
closefile(mytextfile);
end;
btnStart.Enabled := true;
btnResult.Enabled := true;
btnSelect.Enabled := true;
btnSetWord.Enabled := true;
btnStop.Enabled := false;
btnExit.Enabled := True;
Running := false; //表明线程已经结束
//Edit2.Text := datetimetoStr(now);
end;
启动线程的代码是:
procedure TForm1.btnStartClick(Sender: TObject);
begin
//DeleteInvalid;
if ((sOldFileName = '') or (not fileExists(sDir + '\' + sOldFileName)))then begin
IniCheckPath;
end;
if ((sOldFileName = '') or (not fileExists(sDir + '\' + sOldFileName)))then begin
Messagebox(handle, '数据表路径不对,请先选择文件。', '警告', MB_OK + MB_ICONERROR);
exit;
end;
if (MessageBox(handle, '先排序吗?按确定先排序,按取消不排序。', '提示', MB_OKCANCEL +MB_ICONINFORMATION) = ID_OK) then
SortFlag := true
else
SortFlag := false;
btnStop.Enabled := true;
btnResult.Enabled := false;
btnStart.Enabled := false;
btnSelect.Enabled := false;
btnSetWord.Enabled := false;
btnExit.Enabled := false;
trdCheck := TCheckThread.Create; //创建查错线程
//Edit1.Text := datetimetoStr(now);
with trdCheck do
OnTerminate := ThreadDone;
end;线程结束后的操作是这样的
procedure TForm1.ThreadDone(Sender :TObject);
var
i :integer;
mytextfile:textfile;
sErrorFile : String;
pNewTemp :pCallingRec;
begin
ModifyToOld;//改回字段名
sErrorFile := sCurrentDir + 'Error.txt';
assignfile(mytextfile, sErrorFile);
if fileexists(sErrorFile) then
deletefile(sErrorFile);
rewrite(mytextfile);
try
writeln(mytextfile, '记录号 ', ' 主叫 ',' 开始日期 ', ' 开始时间 ', ' 时长');
pNewTemp := pError;
i := 1;
while pNewTemp <> nil do
begin
with pNewTemp^ do
begin
if i Mod 2 <> 0 then
writeln(mytextfile);
writeln(mytextfile, ' '+ IntToStr(iRecNo) + ' ', IntToStr(iCalling) + ' ', ' '+copy(sBeginTime, 1, 4) + ' ', copy(sBeginTime, 5, 10)+ ' ', inttoStr(iDuration));
end;
pNewTemp := pNewTemp.pNext;
Inc(i);
end;
pNewTemp := pError;
while pNewTemp <> nil do
begin
pNewTemp := pNewTemp.pNext;
Dispose(pError);
pError := pNewTemp;
end;
finally
closefile(mytextfile);
end;
btnStart.Enabled := true;
btnResult.Enabled := true;
btnSelect.Enabled := true;
btnSetWord.Enabled := true;
btnStop.Enabled := false;
btnExit.Enabled := True;
Running := false; //表明线程已经结束
//Edit2.Text := datetimetoStr(now);
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货