线程在运行完自己的那个函数(EXECUTE),就自动退出的了。你再Resume也没有用的。想要一个线程用完之后再用,你必须在EXECUTE里建立一个循环,使得这个函数不会被终止。例如加入: while ..do ...your code
等Execute里所有的代码执行完后,你的线程已消毁了, 你只有重新建立这个线程的实例,
当然你也可以再CREATE()它了啊;
没有清除啊,我设了FreeOnTerminate := false;
procedure TStauts_Watcher.Execute; begin while Not Terminated do begin Synchronize(Watcher_Stauts); Sleep(3000); end; end;这样你的线程才不会自动消毁
为什么不能用循环? var EventSignaled:DWORD; EventsToWait:array [0..1] of Thandle; begin EventsToWait[0]:=CloseEvent; EventsToWait[1]:=YourEvent; while true do begin EventSignaled := WaitForMultipleObjects(2,@EventsToWait,False, INFINITE); case EventSignaled of Wait_Object_0: begin exit; end; Wait_Object_0+1: begin do your things; end; Wait_Failed:exit; end; end;
while ..do
...your code
你只有重新建立这个线程的实例,
procedure TStauts_Watcher.Execute;
begin
while Not Terminated do
begin
Synchronize(Watcher_Stauts);
Sleep(3000);
end;
end;这样你的线程才不会自动消毁
var
EventSignaled:DWORD;
EventsToWait:array [0..1] of Thandle;
begin
EventsToWait[0]:=CloseEvent;
EventsToWait[1]:=YourEvent;
while true do
begin
EventSignaled := WaitForMultipleObjects(2,@EventsToWait,False, INFINITE);
case EventSignaled of
Wait_Object_0:
begin
exit;
end;
Wait_Object_0+1:
begin
do your things;
end;
Wait_Failed:exit;
end;
end;
end;
用YourEvent:=createevent(......)来创建event,用setevnt(yourevent)来通知waitmultipleobjects,返回值便是Wait_Object_0+yourevent在eventstowait中的顺序