小弟编写了一个线程程序,要实现复杂的长时间的计算问题。当运行一段时间后,系统提示我‘不允许在canvas上drawing’。请问是为什么,怎么解决?
程序如下
//=======================================================
type
Tnewlife=class(Tthread)
private
protected
procedure execute;override;
public
end;var
new:Tnewlife;procedure Tnewlife.execute ;
var
P,Pc,A0,C0,Kic,Kth,PD,m,D,R,Dk:double;
Si,Ri:double;
sqlstr:string;
Ni,totallife:integer;
life:cracklifetype;
K:double;
begin
freeonterminate:=true;
with dmpublic.ADOQcmp do
begin
close;
sql.Clear;
sqlstr:='select * from sect_stren where class=:V2 and sectid=:V3';
sql.Add(sqlstr);
parameters.ParamByName('V2').Value:=Fmain.Fsubtype;
parameters.ParamByName('V3').Value:=Fmain.dangersect;
open;
D:=1000*fieldvalues['d']; //找到危险截面的直径
end;
totallife:=0;
P:=strtofloat(Fmain.SE_P.Text);
PC:=strtofloat(Fmain.SE_PC.Text);
A0:=strtofloat(Fmain.SE_A0.Text);
C0:=Fmain.Ca(a0);
Kic:=strtofloat(Fmain.SE_Kic.Text);
Kth:=strtofloat(Fmain.N_Kth.text);
PD:=strtofloat(Fmain.N_D.Text);
m:=strtofloat(Fmain.N_m.Text);
R:=strtofloat(Fmain.N_R1.Text);
Dk:=strtofloat(Fmain.SE_Dk.text);
with dmpublic.ADOQcmp do
begin
close;
sql.Clear;
sqlstr:='select result,Ni from resulta where sectid=:V1 order by result desc'; //降序排列载荷谱
sql.Add(sqlstr);
parameters.ParamByName('V1').Value:=Fmain.dangersect;
open;
first;
Si:=fieldvalues['result'];
Ni:=fieldvalues['ni'];
life:=Fmain.NewModellife(P,Pc,PD,m,a0,c0,D,Si,Kth,Kic,R,ni);
repeat
if eof then first
else next;
Fmain.SeSkinMemo1.Lines.Clear;
Si:=fieldvalues['result'];
Ni:=fieldvalues['ni'];
totallife:=totallife+life.life;
life:=Fmain.NewModellife(P,Pc,PD,m,life.a,Fmain.Ca(life.a),D,Si,Kth,Kic,R,ni);
Fmain.SeSkinMemo1.Lines.Add('该结果为'+ format('%10.6e',[3.1415926*totallife*dk/1000.0]) );
until life.index;
end;
showmessage('该结果为'+inttostr(totallife));
end;
end;
程序如下
//=======================================================
type
Tnewlife=class(Tthread)
private
protected
procedure execute;override;
public
end;var
new:Tnewlife;procedure Tnewlife.execute ;
var
P,Pc,A0,C0,Kic,Kth,PD,m,D,R,Dk:double;
Si,Ri:double;
sqlstr:string;
Ni,totallife:integer;
life:cracklifetype;
K:double;
begin
freeonterminate:=true;
with dmpublic.ADOQcmp do
begin
close;
sql.Clear;
sqlstr:='select * from sect_stren where class=:V2 and sectid=:V3';
sql.Add(sqlstr);
parameters.ParamByName('V2').Value:=Fmain.Fsubtype;
parameters.ParamByName('V3').Value:=Fmain.dangersect;
open;
D:=1000*fieldvalues['d']; //找到危险截面的直径
end;
totallife:=0;
P:=strtofloat(Fmain.SE_P.Text);
PC:=strtofloat(Fmain.SE_PC.Text);
A0:=strtofloat(Fmain.SE_A0.Text);
C0:=Fmain.Ca(a0);
Kic:=strtofloat(Fmain.SE_Kic.Text);
Kth:=strtofloat(Fmain.N_Kth.text);
PD:=strtofloat(Fmain.N_D.Text);
m:=strtofloat(Fmain.N_m.Text);
R:=strtofloat(Fmain.N_R1.Text);
Dk:=strtofloat(Fmain.SE_Dk.text);
with dmpublic.ADOQcmp do
begin
close;
sql.Clear;
sqlstr:='select result,Ni from resulta where sectid=:V1 order by result desc'; //降序排列载荷谱
sql.Add(sqlstr);
parameters.ParamByName('V1').Value:=Fmain.dangersect;
open;
first;
Si:=fieldvalues['result'];
Ni:=fieldvalues['ni'];
life:=Fmain.NewModellife(P,Pc,PD,m,a0,c0,D,Si,Kth,Kic,R,ni);
repeat
if eof then first
else next;
Fmain.SeSkinMemo1.Lines.Clear;
Si:=fieldvalues['result'];
Ni:=fieldvalues['ni'];
totallife:=totallife+life.life;
life:=Fmain.NewModellife(P,Pc,PD,m,life.a,Fmain.Ca(life.a),D,Si,Kth,Kic,R,ni);
Fmain.SeSkinMemo1.Lines.Add('该结果为'+ format('%10.6e',[3.1415926*totallife*dk/1000.0]) );
until life.index;
end;
showmessage('该结果为'+inttostr(totallife));
end;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货