有关MsgWaitForMultipleObjects的使用说明,请高手帮助!!!(50分)

  • 主题发起人 主题发起人 newhand
  • 开始时间 开始时间
N

newhand

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在线程中使用MsgWaitForMultipleObjects,以下是我找到的代码,但不知道如何使用,
请大家帮助解释一下,谢谢!
PeekMessage(msg, 0, 0, 0, PM_NOREMOVE);
//1.为什么使用这行代码
msgHandles := CreateEvent(nil, True, False, nil);
while truedo
begin
case MsgWaitForMultipleObjects(0,msgHandles,False,200,QS_ALLINPUT) of
WAIT_OBJECT_0:
begin
//2.这里写什么代码,什么时候运行到这里,WAIT_OBJECT_0是什么意思?
break;
end;
WAIT_OBJECT_0 + 1:
begin
//3.这里写什么代码,什么时候运行到这里,WAIT_OBJECT_0 + 1 是什么意思?
while PeekMessage(msg, 0, 0, 0, PM_REMOVE)do
begin
//if msg.msg = ... then

DispatchMessage(msg);
//4.这行代码起什么作用
end;
end;
end;
end;
请哪位熟悉消息的帮助解释解释,不胜感激!!!
 
PeekMessage(msg, 0, 0, 0, PM_NOREMOVE);
//1.为什么使用这行代码
***通知Windows本线程将能够接收消息通知
msgHandles := CreateEvent(nil, True, False, nil);
while truedo
begin
case MsgWaitForMultipleObjects([red]0[/red],msgHandles,False,200,QS_ALLINPUT) of
***对象个数不能是0!否则永远不可能返回WAIT_OBJECT_0
WAIT_OBJECT_0:
begin
//2.这里写什么代码,什么时候运行到这里,WAIT_OBJECT_0是什么意思?
***MsgWaitForMultipleObjects函数可以同时等待最多64个内核对象,当等待的对象发信号时
***函数返回该对象的序号,这个序号从WAIT_OBJECT_0开始,然后是WAIT_OBJECT_0 + 1...
***直到WAIT_OBJECT_0 + n - 1,其中n是对象个数
***你调用CreateEvent函数时事件为手工复位,应该在这里调用ResetEvent手工复位
***执行Break说明该事件的目的是终止线程(这样非常规范),只要SetEvent函数,线程中的循环
***即会终止
break;
end;
WAIT_OBJECT_0 + 1:
begin
//3.这里写什么代码,什么时候运行到这里,WAIT_OBJECT_0 + 1 是什么意思?
***当你等待的对象没有处于发信号状态时,如果有消息到达,MsgWaitForMultipleObjects函数
***将返回WAIT_OBJECT_0 + n,其中n是对象个数
while PeekMessage(msg, 0, 0, 0, PM_REMOVE)do
begin
//if msg.msg = ... then

DispatchMessage(msg);
//4.这行代码起什么作用
***请求Windows重新分发消息消息,也就是调用相应的窗口过程
end;
end;
end;
end;
 
to:barton
非常感谢,有点明白,也有点不明白。
>当你等待的对象没有处于发信号状态时
这个“等待的对象”是什么?
我的目的是:在线程中等待数据的到来,如果数据到了,就退出该MsgWaitForMultipleObjects,否则30秒后就算超时,也退出该MsgWaitForMultipleObjects。
还有就是在线程外,按cancel按钮,手工终止等待数据,退出MsgWaitForMultipleObjects。
这样,我要如何编写代码? 请再指点一下,谢谢!
 
“等待的对象”就是你等待的对象呀[:D]
你看看函数名:Wait for Multiple Objects直译就是等待多个对象。对象是指Windows
的内核对象,种类很多,一共十种,包括事件(Event)、信标(Semaphore)等等,每一种对
象都有一种发信号的方法。以下这个贴子内有关于这些对象的一些描述:
http://www.delphibbs.com/delphibbs/dispq.asp?LID=1999919
MsgWaitForMultipleObjects(0,msgHandles,False,[red]200[/red],QS_ALLINPUT)
这是个超时设定。如果是30秒,改为30000(ms为单位)。这样当时间到了,可是等待的事
件(又是个等待的事件[:D])也没有发信号,也没有谁投递消息(通过PostThreadMessage
函数),这时候MsgWaitForMultipleObjects返回另一个结果:WAIT_TIMEOUT。如果超时后
你希望退出线程,你也可以与WAIT_OBJECT_0并列写一个WAIT_TIMEOUT,处理时写Break。
如果在线程外手工终止线程有两种方法:一是直接让事件进入发信号状态,调用
SetEvent(msgHandles)函数,这样你需要将msgHandle公布出来让线程外能够访问(方法
很多,可以将它做为线程的属性,可以做成全局或静态的变量)。二是向线程发送一个消
息,在WAIT_OBJECT_0 + n时,你先用PeekMessage取出这个消息,如果这个消息正是你希
望终止这个线程的消息,执行Break就行了。
WAIT_OBJECT_0 + 1:
begin
PeekMessage(Msg, 0, 0, 0, PM_REMOVE);
if Msg.Msg = WM_USER then
Break
else
DispatchMessage(Msg);
end;
这两种方法都可以在Cancel按钮的OnClick事件中调用:
第一种:SetEvent(msgHandles);
第二种:PostThreadMessage(Thread.ThreadID, WM_USER, 0, 0)。
 
to:barton
太谢谢了,我先试一下,有问题还要请你指点指点:)
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部