小弟我用了线程,为什么在执行的时候程序还是假死状态呢
我用了线程,为什么在执行的时候程序还是假死状态呢?
代码如下:
TExcelToSQL = class(TThread)
private
{ Private declarations }
protected
procedure update;
procedure Execute; override;
end;
procedure TExcelToSQL.Execute;
begin
Synchronize(update);
end;
procedure TExcelToSQL.update;
var
i,j,k,l,m:integer;
F_Field:array [0..50] of String; //源字段
S_Field:array [0..50] of String; //映谢字段
begin
if tablename='goods' then
begin
begin
Btn_Start.Enabled:=False;
OpenDataSet(Qry_Import,'Select * from tGoods');
for i:=1 to FrmMain.b_row-1 do
begin
ProgressBar1.Max:=FrmMain.b_row-1;
FrmData.ADOConnection1.BeginTrans;
try
with Qry_Import do
begin
Append;
For k:=1 to Qry_Field.RecordCount do
begin
m:=FrmMain.ImportFields.IndexOf(F_Field[k])+1;
for l:=1 to Qry_Field.RecordCount do
begin
FieldByname(S_Field[k]).AsString:=FrmMain.eclApp.activesheet.cells.item[i+1,m].Text;
end;
end;
Post;
end;
FrmData.ADOConnection1.CommitTrans;
except
FrmData.ADOConnection1.RollbackTrans;
end;
ProgressBar1.Position:=i;
end;
MessageDlg(Pchar('导入数据完成,导入成功 '+inttostr(o)+' 条,导入失败 '+inttostr(p)+' 条'),mtConfirmation, [mbOK], 0);
Btn_Start.Enabled:=True;
end;
end;
end;
end;
procedure TFrmImport.Btn_StartClick(Sender: TObject);
begin
with TExcelToSQL.Create(True) do Resume;
end;
------解决方案--------------------
去掉 Synchronize
使用的控件全局改成线程中动态创建。
------解决方案--------------------
你这个的确是线程,但是“假线程”,
procedure TExcelToSQL.Execute;
begin
Synchronize(update);
end;
线程时间全部是用来线程同步的调用了,这样使用线程毫无意义
------解决方案--------------------
代码如下:
TExcelToSQL = class(TThread)
private
{ Private declarations }
protected
procedure update;
procedure Execute; override;
end;
procedure TExcelToSQL.Execute;
begin
Synchronize(update);
end;
procedure TExcelToSQL.update;
var
i,j,k,l,m:integer;
F_Field:array [0..50] of String; //源字段
S_Field:array [0..50] of String; //映谢字段
begin
if tablename='goods' then
begin
begin
Btn_Start.Enabled:=False;
OpenDataSet(Qry_Import,'Select * from tGoods');
for i:=1 to FrmMain.b_row-1 do
begin
ProgressBar1.Max:=FrmMain.b_row-1;
FrmData.ADOConnection1.BeginTrans;
try
with Qry_Import do
begin
Append;
For k:=1 to Qry_Field.RecordCount do
begin
m:=FrmMain.ImportFields.IndexOf(F_Field[k])+1;
for l:=1 to Qry_Field.RecordCount do
begin
FieldByname(S_Field[k]).AsString:=FrmMain.eclApp.activesheet.cells.item[i+1,m].Text;
end;
end;
Post;
end;
FrmData.ADOConnection1.CommitTrans;
except
FrmData.ADOConnection1.RollbackTrans;
end;
ProgressBar1.Position:=i;
end;
MessageDlg(Pchar('导入数据完成,导入成功 '+inttostr(o)+' 条,导入失败 '+inttostr(p)+' 条'),mtConfirmation, [mbOK], 0);
Btn_Start.Enabled:=True;
end;
end;
end;
end;
procedure TFrmImport.Btn_StartClick(Sender: TObject);
begin
with TExcelToSQL.Create(True) do Resume;
end;
------解决方案--------------------
去掉 Synchronize
使用的控件全局改成线程中动态创建。
------解决方案--------------------
你这个的确是线程,但是“假线程”,
procedure TExcelToSQL.Execute;
begin
Synchronize(update);
end;
线程时间全部是用来线程同步的调用了,这样使用线程毫无意义
------解决方案--------------------