有一个多线程的应用程序,在运行完成后,不会自动释放资源,FreeOnTerminate :=True我也设置了,我每运行一次,内存消耗就多8-10K,应该是会自动释放的啊,哪位大侠帮帮忙!我就20分了。
unit testthread;interfaceuses
  Classes,adodb,db,SysUtils, IdGlobal;type
  SendSalesActionMsg = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  Public
    constructor   Create();
    destructor   Destroy;   override;
  end;implementationuses Unit1;
constructor  SendSalesActionMsg.Create ;
Begin
   self.FreeOnTerminate :=True;
   inherited Create(False);
end;destructor   SendSalesActionMsg.Destroy;
 begin
     inherited Destroy;
 end;procedure SendSalesActionMsg.Execute ;
var
Begin
  .......... process code
ENd;end.

解决方案 »

  1.   

    谢了,问题解决了.是因为execute中不可以自己结束线程,我以前用了self.destory,结果资源没有释放.
    感谢各位的热心帮忙!只有20分送给失踪的月亮吧
      

  2.   

    procedure NewThread.DoData;
    var
        ADOQry:TADOQuery;
        StrID:String;
    begin
       FreeOnTerminate:=True;
       Randomize;
       StrID:=IntToStr(Random(50)+1);   ADOQry:=TADOQuery.Create(nil);
       ADOQry.Connection:=ADOConMain;   ADOQry.Close;
       ADOQry.SQL.Clear;
       ADOQry.SQL.Add('Select * from users where id='+QuotedStr(StrID));
       ADOQry.Open;   Unit1.Form1.Memo1.Lines.Add(ADOQry.FieldByName('ID').AsString);
       ADOQry.Close;
       ADOQry.Free;
       Application.ProcessMessages;
    end;procedure NewThread.Execute;
    begin
       Synchronize(DoData);
      { Place thread code here }
    end;//---------------------------------unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls,ActiveX,Unit2, ExtCtrls;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        Memo1: TMemo;
        Edit1: TEdit;
        Button1: TButton;
        Button2: TButton;
        Timer1: TTimer;
        Button3: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        MyThread:NewThread;
        AllThread:Integer;
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
      i:Integer;
    begin
        ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add('SELECT *  FROM users');
        ADOQuery1.Open;    if ADOQuery1.RecordCount<1 then
        begin
          for i:=1 to 50 Do
          begin
             ADOQuery1.Close;
             ADOQuery1.SQL.Clear;
             ADOQuery1.SQL.Add('insert into users(id,name) values('+QuotedStr(IntToStr(i))+','+QuotedStr(IntToStr(i))+')');
             ADOQuery1.ExecSQL;
          end;
        End;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i:Integer;
    begin
        OleInitialize(nil);
       AllThread:=StrToInt(Edit1.Text);    for i:=1 to AllThread do
        begin
          MyThread:=NewThread.Create(True);
          MyThread.ADOConMain:=TADOConnection.Create(nil);
          MyThread.ADOConMain:=ADOConnection1;
          MyThread.ADOConMain.LoginPrompt:=False;
          MyThread.Resume;
          Memo1.Lines.Add('开启线程'+InttoStr(i));
          MyThread.ADOConMain.Close;
          Sleep(1);
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      i:Integer;
    begin
        OleUninitialize;
        for i:=1 to AllThread do
        begin
           MyThread.Suspend;
          Memo1.Lines.Add('线程关闭'+IntToStr(i));
        end;
        Timer1.Enabled:=False;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
       Timer1.Enabled:=False;
       Button1Click(nil);
       Timer1.Enabled:=True;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
       Timer1.Enabled:=True;
    end;end.
    运行一段时间之后就出现了存储空间不足,无法处理此命令的解决方案的错误,而且运行中CPU跳得很高