我想实现在任何时候终止n线程,但是用以下方法没反映,反而程序死了.unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  n:Tthread;implementationuses unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin
n:=Ttestthread.create(false);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
n.Terminate;
n.Free;
end;end.
unit Unit2;interfaceuses
  Classes,SysUtils;type
  TtestThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;implementationuses unit1;{ 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 TtestThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }{ TtestThread }procedure TtestThread.Execute;
var i,t:integer;
begin
FreeOnTerminate := true;
t:=1;
while t=1 do
begin
for i:=1 to 20000 do
  begin
    form1.label1.Caption:=inttostr(i);
  end;
  end;
end;end.

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TtestThread = class(TThread)
      private
        FIndex: integer;
        procedure WriteCaption;
      protected
        procedure Execute; override;
      end;var
      Form1: TForm1;
      myThread: TTestThread;implementation{$R *.dfm}{ TtestThread }
    procedure TtestThread.Execute;
    begin
      FreeOnTerminate := true;
      while not Terminated do
      begin
        Inc(FIndex);
        if FINdex > 20000 then FIndex := 1;
        Synchronize(Self, WriteCaption);
        Sleep(10);
      end;
    end;
    procedure TtestThread.WriteCaption;
    begin
      form1.label1.Caption:= inttostr(FIndex);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      if myThread = nil then
      begin
        MyThread := TTestThread.Create(True);
        MyThread.FIndex := 1;
        MyThread.Resume;
      end
      else begin
        MyThread.Terminate;
        MyThread := nil;
      end;end;end.按一下button1开始, 再按一下结束。你的问题在于while t=1 do  //没有结束条件,相当于 While True do了,死循环
    begin
    for i:=1 to 20000 do  //同样,只要到了这就最起码得来20000次
      begin
        form1.label1.Caption:=inttostr(i);
      end;
      end;
    end;
      

  2.   

    或者设置标志看是否结束线程
    type
      TtestThread = class(TThread)
      private
       runable:boolean;
        { Private declarations }
      protected
        procedure Execute; override;
      end;while true and runable do 
    begin
    for i:=1 to 20000 do  //同样,只要到了这就最起码得来20000次
      begin
        if runable then
          form1.label1.Caption:=inttostr(i)
        else
         break;
      end;
      end;
    end;