小弟编写了一个线程程序,要实现复杂的长时间的计算问题。当运行一段时间后,系统提示我‘不允许在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;