我经常用这样一个方法自己挂起自己
在主线程,和子线程中申请两个同名私有变量(方便记忆) SuspendEvent : THandle;
CloseEvent:THandle
在创建主线程(如果是Form1则在TForm1.form1Create方法中)的方法中
SuspendEvent:=CreateEvent(nil,True,False,Nil);//手动复位 无信号,线程挂起状态。
CloseEvent:=CreateEvent(nil,True,False,Nil);//
接着在创建完子线程后加上MyThread1.SuspendEvent:=SuspendEvent;
MyThread1.CloseEvent:=CloseEvent;
子线程的Execute执行程序:
procedure MyThread1.Execute;
var
HandlesWaitFor : array[0..1] of THandle;
dwHandleSignaled : DWord;
Label:
EndThread;
begin
HandlesWaitFor[0]:= SuspendEvent;
HandlesWaitFor[0]:= CloseEvent;
While Truedo
begin
// 执行程序
//下面是挂起代码
dwHandleSignaled:=WaitForMultipleObjects(2,@HandlesWaitFor,false,INFINITE);
Case dwHandleSignaled of
WAIT_OBJECT_0: //取消挂起Resume
begin
Continue;
end;
WAIT_OBJECT_0+1: //结束子线程
begin
Goto EndThread;
end;
end;
EndThread:
//释放申请的内存,释放实例
end;
什么地方想挂起子线程就在什么地方写ReSetEvent(SuspendEvent);包括子线程自己
什么地方想唤醒子线程就在什么地方写SetEvent(SuspendEvent);只能在子线程外并能访问主线程成员SuspendEvent的地方。
什么地方想把线程杀死就用SetEvent(CloseEvent);包括子线程自己。