线程问题(100分)

  • 主题发起人 主题发起人 muhx
  • 开始时间 开始时间
M

muhx

Unregistered / Unconfirmed
GUEST, unregistred user!
有一段线程的执行代码
procedure TThreadReadData.Execute;
var
hEvent:Cardinal;
begin
hEvent:=CreateEvent(nil,True,False,nil);
while not Terminateddo
begin
Synchronize(ReadDate);
Synchronize(RefreshAlarmList);
SetDevList_No;
ResetEvent(hEvent);
WaitForSingleObject(hEvent,500);
end;
CloseHandle(hEvent);
end;
请帮我解释一下
ResetEvent(hEvent);
WaitForSingleObject(hEvent,500);
是什么含义,起什么作用,谢谢
 
没有人感兴趣?
 
是API读串口吧:
ResetEvent(hEvent);
//同步事件复位
WaitForSingleObject(hEvent,500);//等待同步事件置位
一般可以这样使用:
if WaitForsingleobject(fPost_Event,infinite)=Wait_Object_0 then

begin
resetEvent(fPost_Event);

//在这里可以触发串口接收事件
ReadStr;
//Synchronize(ReadStr);
end;
 
只要线程不结束
每隔500毫秒
在主线程执行一系列操作
 
WaitForSingleObject 是等待。相当于挂起吧。
ResetEvent就是重置该事件了。
 
WaitForSingleObject(hEvent,500);//等待同步事件置位
 
procedure TThreadReadData.Execute;
var
hEvent:Cardinal;
begin
hEvent:=CreateEvent(nil,True,False,nil);//创建一个事件,事件是Windows系统的一个概念,不是Delphi自己的事件
while not Terminateddo
//如果线程没有结束
begin
Synchronize(ReadDate);
Synchronize(RefreshAlarmList);
SetDevList_No;
ResetEvent(hEvent);
//恢复事件到就绪状态
WaitForSingleObject(hEvent,500);
//等候事件的触发,如果没有被触发,500毫秒后自动被触发.循环得以继续
end;
CloseHandle(hEvent);
//关闭事件
end;


事件实际上和线程的状态有关.当ResetEvent的时候事件表示被置为就绪状态.WaitForSingleObject就是把线程标志为挂起状态.代码就停在这里.直到有另外一个线程把事件置为触发状态该线程才会变成可以运行状态.或者是等候超时,事件也会被触发.
 
wr960204兄弟
hEvent:=CreateEvent(nil,True,False,nil);这句说明hEvent只是临时变量
不可能有别的地方设置它为运行状态
所以
WaitForSingleObject(hEvent,500);这句实际上是强行让代码在这里停止500毫秒
这样理解对吗?
谢谢
 
对,那个WaitForSingleObject在此处的功能其实类似于sleep(500)。
 
hEvent是临时变量,出了这个过程就不能用.但是这个实际的EVENT对象是实际存在与系统内核中的全局的.只要把hEvent传出去,在外面也一样可以使用.
WaitForSingleObject(hEvent,500);就是等待这个事件被触发.如果没有被触发就500毫秒后自动触发一下.
 
事件在任何时候都处于两种状态之一: 有信号和无信号
WaitForSingleObject(hEvent,500);
等待事件变成有信号,等500毫秒,只有有信号时才能往下继续执行
SetEvent()将事件设成有信号
ResetEvent()将事件设成无信号
 
多人接受答案了。
 

Similar threads

后退
顶部