//创建线程.
procedure TForm1.N1Click(Sender: TObject);
var
  NewNode:TTreeNode;
  d:string;
begin
  if MyThread1=Nil then
  begin
    NewNode:=treeview1.TopItem;
    while NewNode<>nil do
    begin
     d:=newnode.text;
      MyThread1:=TFileSysNotifyThread.create(NewNode.text,File_Notify_Change_File_Name or File_Notify_Change_Dir_Name,MyThread1);
      NewNode:=NewNode.getNextSibling ;
    end;
  end
  else
    ShowMessage('线程正在运行');end;//退出线程。
procedure TForm1.N3Click(Sender: TObject);
var
  newnode:ttreenode;
begin
  if MyThread1<>Nil then
  begin
    NewNode:=treeview1.TopItem;
    while NewNode<>nil do
    begin
    MyThread1.Terminate;
    NewNode:=NewNode.getNextSibling ;
    end;
  end
  else
      ShowMessage('线程未运行');
end;

解决方案 »

  1.   

    unit FileSysThread;interfaceuses
      Windows,SysUtils,Classes,comctrls,SMsg;type
      TFileSysNotifyThread=class(TThread)
      private
        ErrCode:integer;
        KillAddress:PInteger;
        NotifyHandle:THandle;
        WatchPath:string;
        WatchMask:integer;
        procedure SignalFileNotification;
        procedure OnCompleted(Sender: TObject);
      protected
        procedure Execute;override;
      public
        constructor Create (const AWatchPath:string; AWatchMask:Integer;var Myself:TFileSysNotifyThread);
        destructor Destroy;override;
      end;implementationuses Dialogs,Test;var
      Form1: TForm1;constructor TFileSysNotifyThread.Create(const AWatchPath:string; AWatchMask:Integer;var Myself:TFileSysNotifyThread);
    begin
      Inherited Create(True);
      Form1:=TForm1.Create(nil);
      WatchPath:=AWatchPath;
      WatchMask:=AWatchMask;
      KillAddress:=Addr(Myself);
      Priority:=tpLower;
      FreeOnTerminate:=True;
      Suspended:=False;
    end;
    destructor TFileSysNotifyThread.Destroy;
    begin
      if NotifyHandle<>THandle(-1) then
        FindCloseChangeNotification(NotifyHandle);
      inherited Destroy;
      KillAddress^:=0;
    end;procedure TFileSysNotifyThread.execute;
    begin
      NotifyHandle:=FindFirstChangeNotification(PChar(WatchPath),true,WatchMask);
      if NotifyHandle<>THandle(-1) then
        while not Terminated do begin
          ErrCode:=WaitForSingleObject(NotifyHandle,250);
          case ErrCode of
            Wait_Timeout:;
            Wait_Object_0:
              begin            Synchronize(SignalFileNotification);
                FindNextChangeNotification(NotifyHandle);
              end;
            else;
          end;
        end;
    end;procedure TFileSysNotifyThread.OnCompleted(Sender: TObject);
    beginend;procedure TFileSysNotifyThread.signalfilenotification;
    var
      Node:TTreeNode;
      i,j:integer;
    begin
      Form1.aa(WatchPath);end;end.
      

  2.   

    是不是你只创建了一个线程,而不是三个?
    while NewNode<>nil do
        begin
         d:=newnode.text;
          MyThread1:=TFileSysNotifyThread.create(NewNode.text,File_Notify_Change_File_Name or File_Notify_Change_Dir_Name,MyThread1);
          NewNode:=NewNode.getNextSibling ;
        end;
    这样是不是只创建了一个,是不是可以用对象数组来实现?---MyThread[i]
      

  3.   

    procedure TForm1.N1Click(Sender: TObject);
    var
      NewNode:TTreeNode;
      d:string;
    begin
      if MyThread1=Nil then
      begin
        NewNode:=treeview1.TopItem;
        while NewNode<>nil do
        begin
          MyThread1:=TFileSysNotifyThread.create(); //变量被冲掉了。
          NewNode:=NewNode.getNextSibling ;
        end;
      end
      else
        ShowMessage('线程正在运行');end;
      

  4.   

    TO:LocustWei(LocustWei)
       变量被冲掉,应该怎样解决?用对象数组MyThread[i]来解决吗?
      

  5.   

    定义一动态数组,var
      MyThread :array of TFileSysNotifyThread;
    创建
    var
      i:integer;
    begin
     i := 0
    NewNode:=treeview1.TopItem;
        while NewNode<>nil do
        begin
         inc(I);
         Setlength(MyThread,i)
        
         d:=newnode.text;
          MyThread[i-1]:=TFileSysNotifyThread.create(NewNode.text,File_Notify_Change_File_Name or File_Notify_Change_Dir_Name,MyThread1);
          NewNode:=NewNode.getNextSibling ;
        end;
      end
    end;//退出线程。
    procedure TForm1.N3Click(Sender: TObject);
    var
      newnode:ttreenode;
    i:integer;
    begin
      if MyThread1<>Nil then
      begin
        i:=0;
        NewNode:=treeview1.TopItem;
        while NewNode<>nil do
        begin
        inc(i);
        MyThread[i-1].Terminate;
        NewNode:=NewNode.getNextSibling ;
        end;
      end
      else
          ShowMessage('线程未运行');
    end;
    自己测试一下吧!