Unit getinfo;constructor getinfo.Create(h:string;vlist:TTreeview);  //取id!!
begin
  v:=h;
  ViewList:=vlist;
  FreeOnTerminate := True;
  inherited create(false);
end;
function check(a:string):string;
begin
//…
form1.memo1.lines.add(a);
end;procedure getinfo.Execute;
begin
Check(v);
end;
创建线程代码Unit Unit1;
var
infothread:array of getinfo;procedure Tform1.Threadstop;
begin
//如果是这里应该添加什么代码,能让创建的线程立即停止
//我试过Terminate,Free 等都失败了
//出现过 句柄无效 或 程序卡死 或 直到线程将任务处理完成
//我想立即终止线程 让它不在工作 该在哪里添加代码
end;procedure Tform1.GetStart;
var
  i,v: integer;
begin
    SetLength(infothread,self.Memo1.Lines.Count);   // 动态设置线程的数量
    for i := 0 to self.Memo1.Lines.Count -1 do
    begin
      infothread[i] := getinfo.Create(self.Memo1.Lines.Strings[i],self.treeview1);
      infothread[i].OnTerminate := Threadok;
    end;
    end;
end;

解决方案 »

  1.   

    给你改了一下
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, ComCtrls,getinfo;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        TreeView1: TTreeView;
        Button2: TButton;
        procedure Threadstop(sender:TObject);
        procedure GetStart;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      infothread:array of Tgetinfo;
    implementation{$R *.dfm}procedure Tform1.Threadstop(sender:TObject);
    begin
    memo1.Lines.Add('一个线程结束');
    end;procedure Tform1.GetStart;
    var
      i,v: integer;
    begin
        SetLength(infothread,self.Memo1.Lines.Count);   // 动态设置线程的数量
        for i := 0 to self.Memo1.Lines.Count -1 do
        begin
          infothread[i] := Tgetinfo.Create(self.Memo1.Lines.Strings[i],treeview1);
          infothread[i].OnTerminate := ThreadStop;
        end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin   //线程创建按钮
    Getstart;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin   //线程终止按钮,当然这儿终止的是第一个线程
    infothread[0].Terminate;//立即终止线程,当然这儿线程运行很快,看不到效果
    end;end.
      

  2.   

    unit GetInfo;interfaceuses
      Classes,ComCtrls;type
      TGetInfo = class(TThread)
      private
        { Private declarations }
        v,a:string;
        ViewList:TTreeView;
        procedure Check;
      protected
        procedure Execute; override;
      public
        constructor Create(h:string;vlist:TTreeview);
        destructor Destroy;override;
      end;implementationuses unit1;
    procedure TGetInfo.Check;
    begin
    form1.memo1.lines.add(a);
    end;constructor TGetInfo.Create(h:string;vlist:TTreeview);
    begin
    inherited create(true);v:=h;
    ViewList:=vlist;FreeOnTerminate:=True;
    Suspended := false;
    end;destructor TGetInfo.Destroy;
    begin  inherited;
    end;procedure TGetInfo.Execute;
    begin
      a:=v;
      Synchronize(check);
    end;end.
      

  3.   

    上面的没注意,有点小问题,修改后如下
    unit GetInfo;interfaceuses
      Classes,ComCtrls;type
      TGetInfo = class(TThread)
      private
        { Private declarations }
        v,a:string;
        ViewList:TTreeView;
        procedure Check;
      protected
        procedure Execute; override;
      public
        constructor Create(h:string;vlist:TTreeview);
        destructor Destroy;override;
      end;implementationuses unit1;
    procedure TGetInfo.Check;
    begin
    form1.memo1.lines.add(a);
    end;constructor TGetInfo.Create(h:string;vlist:TTreeview);
    begin
    inherited create(true);v:=h;
    ViewList:=vlist;FreeOnTerminate:=True;
    Suspended := false;
    end;destructor TGetInfo.Destroy;
    begin
    //
      inherited;
    end;procedure TGetInfo.Execute;
    var
    i:integer;
    begin
      a:=v;
      for i:=0 to 1000 do
         begin
         Synchronize(check);//这儿给你举了个,运行期间让线程终止的方法
         if self.Terminated then break;
         end;
    end;end.
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, ComCtrls,getinfo;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        TreeView1: TTreeView;
        Button2: TButton;
        procedure Threadstop(sender:TObject);
        procedure GetStart;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      infothread:array of Tgetinfo;
    implementation{$R *.dfm}procedure Tform1.Threadstop(sender:TObject);
    begin
    memo1.Lines.Add('一个线程结束');
    end;procedure Tform1.GetStart;
    var
      i,v: integer;
    begin
        SetLength(infothread,self.Memo1.Lines.Count);   // 动态设置线程的数量
        for i := 0 to self.Memo1.Lines.Count -1 do
        begin
          infothread[i] := Tgetinfo.Create(self.Memo1.Lines.Strings[i],treeview1);
          infothread[i].OnTerminate := ThreadStop;
        end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin   //线程创建按钮
    Getstart;       
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin   //线程终止按钮,当然这儿终止的是第一个线程
    infothread[0].Terminate;//立即终止线程,当然这儿线程运行很快,看不到效果
    end;end.
      

  5.   

    你在线程的execute这里先检查terminated属性。
    这样在主线程里面调用terminate方法就可以让线程终止了。还有就是要注意同步,你在线程里使用了主界面的控件,需要同步。
    ......function check:string;
    begin
      form1.memo1.lines.add(v);//为了后面的同步调用简单,这里直接使用线程类的变量而不再用参数了
    end;procedure getinfo.Execute;
    begin
      if not Terminated then break;  //
      Synchronize(Check);   //同步
    end;
     主线程调用的时候就:infothread[i].Terminate ;
      

  6.   

    只说下核心思想:如果想线程能随时终止,最重要的是看你Execute里面的写法。一般来说Execute是通过判断Terminated属性来获知线程是否被通知了终止(注意没有真的终止)。想随时终止的话,就要让Execute随时检查到这个属性。因此while not terminated那个循环里,必须把大的操作分小(如Sleep 10000的,就分成100次来Sleep,每次循环都判断一次是不是Terminated了)。只要避免线程内部长时间堵塞,随时检查Terminated属性,即可让线程随时停下。当然你也可以用TerminateThread强行结束线程,但是造成的问题自负责任。
      

  7.   

    谢谢 但是我用了你用代码嵌入程序后,程序会卡死?Synchronize(Check); 这里能使用过程传递吗?
    比如 Synchronize(check(info)); ? 那样估计会好.
      

  8.   

    为什么我用Synchronize函数会很卡..
      

  9.   

    很牛很困难的问题 关于终止多线程的问题 明天上午10点结贴
    发表于:2008-07-02 02:08:02时间过去多长时间了Synchronize(Check); //只能这样调用 Synchronize(check(info)); //不能这样