//创建线程.
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;
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;
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.
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]
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;
变量被冲掉,应该怎样解决?用对象数组MyThread[i]来解决吗?
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;
自己测试一下吧!