再请教WaitForSingleObject的使用 ( 积分: 100 )

  • 主题发起人 主题发起人 xxhadsg
  • 开始时间 开始时间
X

xxhadsg

Unregistered / Unconfirmed
GUEST, unregistred user!
我在对象create中创建了一个事件句柄:
FEventHandle := CreateEvent(Nil, True, False, nil);//PChar( 'ComPortDmEvent'));
在执行一个命令时:
procedure executecommand;
begin
//......
SetEvent( FEventHandle);

//WaitForSingleObject等待同步处理,直到超时或事件对象产生数据信号,
Result := WaitForSingleObject(FEventHandle, FCommandTimeOut) = WAIT_OBJECT_0;
end;

然后在Comm口接收数据事件中设置了信号状态:
ResetEvent( FEventHandle);

可是为什么只有超时后才能执行收到数据事件?我将这个对象设置为线程,然后在线程的Excute中
处理接收数据也不行。
//接收和处理数据
Synchronize(ProcReceiveData);
请哪位大侠详细解说一下WaitForSingleObject的使用。有完整示例发一个或贴出来也行。adsg@tom.com,谢谢。

再有,我如果在过程A中发送指令,并设置了一个状态Flag为True,在ProcReceiveData中设置Flag为False,则
while not Flagdo
C;
C可以执行,即Flag可以被设置为False.,如果我在线程的Excute中也如此调用A:
Synchronize(A);
那么Flag将不能被设置为False,程序一直等待。请大侠赐教。
 
我在对象create中创建了一个事件句柄:
FEventHandle := CreateEvent(Nil, True, False, nil);//PChar( 'ComPortDmEvent'));
在执行一个命令时:
procedure executecommand;
begin
//......
SetEvent( FEventHandle);

//WaitForSingleObject等待同步处理,直到超时或事件对象产生数据信号,
Result := WaitForSingleObject(FEventHandle, FCommandTimeOut) = WAIT_OBJECT_0;
end;

然后在Comm口接收数据事件中设置了信号状态:
ResetEvent( FEventHandle);

可是为什么只有超时后才能执行收到数据事件?我将这个对象设置为线程,然后在线程的Excute中
处理接收数据也不行。
//接收和处理数据
Synchronize(ProcReceiveData);
请哪位大侠详细解说一下WaitForSingleObject的使用。有完整示例发一个或贴出来也行。adsg@tom.com,谢谢。

再有,我如果在过程A中发送指令,并设置了一个状态Flag为True,在ProcReceiveData中设置Flag为False,则
while not Flagdo
C;
C可以执行,即Flag可以被设置为False.,如果我在线程的Excute中也如此调用A:
Synchronize(A);
那么Flag将不能被设置为False,程序一直等待。请大侠赐教。
 
为什么不看WINAPI说明了,其实很简单的,API文档说得也很清楚
在win32中,Wait一族共四个函数,可以处理的windows内核对象有线程,进程,信号量,互斥量,事件,控制台输入等,
但是你要注意,各种对象的"有信号"状态是不同的,比如等待一个线程,是在线程结束时,等待函数就认为有信号了而返回,而Event就有点相反,是在用SetEvent设置状态后才是有信号
等待线程:
if WaitForSingleObject(FEventHandle, FCommandTimeOut)=WAIT_OBJECT_0
--有信号
被等待的处理线程
处理....
完毕后,SetEvent(FEventHandle),这时候那个等待线程就知道这个处理线程完成了


 
你的问题在于:
Wait族的函数在等待事件对象时,有信号返回时(WAIT_OBJECT_0),是由被等待线程调用SetEvent时,而不是ResetEvent,你换一下函数就是
 
谢谢lynu,请笑纳100大洋吧。
 
后退
顶部