我有一段代码:
MT:=TMyThread1.Create(false);
其中unit MyThread1;interfaceuses
Classes,SysUtils;type
TMyThread1 = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure myqry;
end;implementation
uses HintExcel,QryAgentCre;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TMyThread1.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }{ TMyThread1 }procedure TMyThread1.myqry;
var i:integer;
var t1,t2:real;
begin
i:=1;
QryAgentCreForm.myGetMonth;
with QryAgentCreForm.ADOQuery3 do
begin
close;
Parameters.ParamByName('caller').Value:=QryAgentCreForm.ADOQuery2.Fieldvalues['合同编号'];
open;
QryAgentCreForm.InitSG(QryAgentCreForm.StringGrid3,5);//初始化stringgrid3
QryAgentCreForm.StringGrid3.RowCount:=recordcount+1;
first;
while not eof do
begin
QryAgentCreForm.StringGrid3.Cells[0,i]:=inttostr(i);
QryAgentCreForm.StringGrid3.Cells[1,i]:=QryAgentCreForm.ADOQuery3.FieldValues['主叫号码'];
with QryAgentCreForm.ADOQuery4 do
begin
close;
Parameters.ParamByName('time1').Value:=QryAgentCreForm.time1;
Parameters.ParamByName('time2').Value:=QryAgentCreForm.time2;
Parameters.ParamByName('caller').Value:=QryAgentCreForm.ADOQuery3.FieldValues['主叫号码'];
open;
t1:=fieldbyname('合计').AsFloat;
QryAgentCreForm.StringGrid3.Cells[2,i]:=FormatFloat('0.0',t1);
close;
Parameters.ParamByName('time1').Value:=QryAgentCreForm.time3;
Parameters.ParamByName('time2').Value:=QryAgentCreForm.time4;
open;
t2:=fieldbyname('合计').AsFloat;
QryAgentCreForm.StringGrid3.Cells[3,i]:=FormatFloat('0.0',t2);
QryAgentCreForm.StringGrid3.Cells[4,i]:=FormatFloat('0.0',t1-t2);
end;
next;
inc(i);
end;
end;
end;procedure TMyThread1.Execute;
{ Place thread code here }
begin
Synchronize(myqry);
FreeOnTerminate:=true;
Terminate;
end;
end.可是为什么一执行这个线程后,整个程序就没有响应了?
MT:=TMyThread1.Create(false);
其中unit MyThread1;interfaceuses
Classes,SysUtils;type
TMyThread1 = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure myqry;
end;implementation
uses HintExcel,QryAgentCre;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TMyThread1.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }{ TMyThread1 }procedure TMyThread1.myqry;
var i:integer;
var t1,t2:real;
begin
i:=1;
QryAgentCreForm.myGetMonth;
with QryAgentCreForm.ADOQuery3 do
begin
close;
Parameters.ParamByName('caller').Value:=QryAgentCreForm.ADOQuery2.Fieldvalues['合同编号'];
open;
QryAgentCreForm.InitSG(QryAgentCreForm.StringGrid3,5);//初始化stringgrid3
QryAgentCreForm.StringGrid3.RowCount:=recordcount+1;
first;
while not eof do
begin
QryAgentCreForm.StringGrid3.Cells[0,i]:=inttostr(i);
QryAgentCreForm.StringGrid3.Cells[1,i]:=QryAgentCreForm.ADOQuery3.FieldValues['主叫号码'];
with QryAgentCreForm.ADOQuery4 do
begin
close;
Parameters.ParamByName('time1').Value:=QryAgentCreForm.time1;
Parameters.ParamByName('time2').Value:=QryAgentCreForm.time2;
Parameters.ParamByName('caller').Value:=QryAgentCreForm.ADOQuery3.FieldValues['主叫号码'];
open;
t1:=fieldbyname('合计').AsFloat;
QryAgentCreForm.StringGrid3.Cells[2,i]:=FormatFloat('0.0',t1);
close;
Parameters.ParamByName('time1').Value:=QryAgentCreForm.time3;
Parameters.ParamByName('time2').Value:=QryAgentCreForm.time4;
open;
t2:=fieldbyname('合计').AsFloat;
QryAgentCreForm.StringGrid3.Cells[3,i]:=FormatFloat('0.0',t2);
QryAgentCreForm.StringGrid3.Cells[4,i]:=FormatFloat('0.0',t1-t2);
end;
next;
inc(i);
end;
end;
end;procedure TMyThread1.Execute;
{ Place thread code here }
begin
Synchronize(myqry);
FreeOnTerminate:=true;
Terminate;
end;
end.可是为什么一执行这个线程后,整个程序就没有响应了?
2.FreeOnTerminate:=true;最好写在Execute的第一句,否则容易有问题.
3.有了FreeOnTerminate:=true;就不需要写Terminate;了,多余.
4.建议多看看将线程的文章和例子,再做你的这个线程类.