请教来如风大哥:(200分)

  • 主题发起人 主题发起人 435214
  • 开始时间 开始时间
4

435214

Unregistered / Unconfirmed
GUEST, unregistred user!
非常感谢你教我用单线程,只是我还是有点不大明白.当我在线程中检测到开关量信号后,怎么在线程中将线程挂起阿??或者将它本身kill了???
 
你那个帖子我就想说你呢,
你结的也太早了,呵呵,比较厚道啊:)
 
来如风大哥,教我啊,你才厚道哈:),对我这样的菜鸟的初级问题都耐心回答,感激感激!!!
这问题困扰我好久了.我单位就我偶尔搞搞软件,没人教,也没人可请教的.工作忙,专业也不是搞软件,单位需要了,就自己搞搞,我搞的很弱智的.能用就行.不需要很高身的水平!帮帮忙!
另,不好意思,我没qq号,没时间哈,别笑我哈大哥!!
 
一般线程是一个死循环配合WaitForSingleObject/WaitForMultipleObjects
来检测信号(Event)
While True do
begin
//

end;

EndWriteThread:
//释放申请的内存,和对象
Event 的创建
hEvent:=CreateEvent(nil,True,False,Nil);//hEvent是一个THandle;
第一个Boolean参数代表是否手动复位信号,第二个Boolean参数代表创建完成时这个Event
是否就是有信号状态。头和尾的两个nil不用去管了。
置信号是SetEvent(hEvent),信号复位是ReSetEvent(hEvent);
当然也有线程中不需要循环和Event的,这要看实际需要。
但你说的线程挂起自己就可以用WaitFor这个系列来做,自己杀死自己Goto EndWriteThread
就行了。
 
大哥,教教我啊,怎么线程把自己挂起,详细点,我很菜的,唉,我也是没办法了!!
 
我经常用这样一个方法自己挂起自己
在主线程,和子线程中申请两个同名私有变量(方便记忆) 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);包括子线程自己。
 
或者你在线程中想挂起的地方直接写上Suspend;
这也可以挂起自己哦。
原理都一样。
不过前一种方法一般是用在循环中查询某一个状态,WaitFor系列实际上就是把线程Suspend;
直到需要的状态出现后自动唤醒线程。
如果你是挂起等待某一个信号的话,我觉得还是用WaitFor系列比较好一点。
 
谢谢formality大哥!!!
 
后退
顶部