我想实现这样的动作,按button1创建一个从1到40000计数的线程;按button2结束该线程,此时如果在按button1,计数重新从1开始。
现在的问题是如果我连续按了两次button1,那么button2就不再有反应了。大家看看这是怎么回事吧。unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;  lvThread = class(TThread)
  private
    btn11:tbutton;
  protected
  public
    constructor Create(btn1:tbutton);
    procedure Execute; override;
  end;var
  Form1: TForm1;
  ma:lvthread;implementation{$R *.dfm}{ lvThread }constructor lvThread.Create(btn1: tbutton);
begin
  btn11:=btn1;
  FreeOnTerminate:=true;
  inherited Create(true);
end;procedure lvThread.Execute;
var
  i:integer;
begin
  i:=0;
  repeat
    i:=i+1;
    btn11.Caption:=inttostr(i);
  until (i=40000) or (terminated);
  terminate;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  ma:=lvthread.Create(button1);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  ma:=lvthread.Create(button1);
  if ma.Suspended=true then  ma.Resume;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  ma.Terminate;
end;end.

解决方案 »

  1.   

    应该是
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if not Assigned(ma) then
        ma:=lvthread.Create(button1);
      if ma.Suspended=true then  ma.Resume;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      ma.Terminate;
      FreeAndNil(ma);  
    end;
      

  2.   

    如果想点button1就从1开始计数则
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Assigned(ma) then
        Button2Click(self);
      ma:=lvthread.Create(button1);  
      if ma.Suspended=true then  ma.Resume;
    end;
      

  3.   

    两次button1.click相当于建立两个线程,第一次创建的线程句柄被第二次替代了,此后Button2.click操作的是第二次创建的线程。而此时第一次创建的线程还存在,但是句柄已经丢失。
      

  4.   

    to  singun:我在写的东西加了一行。你看看为什么还会showmessage如果想点button1就从1开始计数则
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Assigned(ma) then Button2Click(self);
     if assigned(ma) then showmessage('');//上面不是terminate了,怎么还有assigned(ma)=true?
      ma:=lvthread.Create(button1);  
      if ma.Suspended=true then  ma.Resume;
    end;
      

  5.   

    你第二个按钮的代码改了吗?要freeandnil哦。
    看这个.http://community.csdn.net/Expert/topic/3800/3800890.xml?temp=.1071894