作者godman362 (青)
看板NUU_CSIE
标题[笔记] WinAPI Thread & Event (2)
时间Sun Jun 21 19:22:56 2009
刚考完期末考,所以有空来把剩下的打完
上次没有把
Handle和
Event讲完
其实,Handle就是
void *
这个就可能要翻一下header file了,这个就自己去找吧
所以他的用途就很广
但是相对地,
很广就很复杂,很复杂就很容易用错(
至理名言)
上次提到的,有一个部份有点小问题
就是我说CreateThread回传的东西,可以用来管理Thread
这句话其实是有点小问题的
这句话应该改成:「
可以藉由回传的东西,来确认Thread是否开启」
而不是管理Thread的起始,起动是由CreateThread函数
结束则是靠我们宣告的ThreadID去处理,
所以他回传的东西和管理无关
好,接着来讲
Event
Event是什麽东西?就中文的翻译来说,叫「事件」
那事件是做什麽用途的?事件是某个物件被触发了某个动作
而该
动作要有相对应的处理方式,而那个处理方式就是事件要做的事情
但是在WinAPI中很特别,他的Event并不是一个Function Point
(
C#中则是前面所述的那种)
不会因为触发後,然後去执行某个函数
他的感觉比较类似於
Flag(旗标)
Flag就是设立之後,有其他地方会来检查这个Flag是否被设立
藉此来判断是否应该执行某动作
以下,先来看一下CreateEvent函数的参数内容:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES IpEventAttributes,
BOOL bManuaIReset,
BOOL bInitialState,
LPCTSTR IpName
);
参数
IpEventAttributes 安全防护性
NULL表示使用预设属性
此属性Windows95会被忽略。
bManualRest
如为FALSE,表示这个event将在变成激发状态
态的event重置为非激发状态。
(因而唤醒一个执行绪)之後,自动重置reset)为
非激发状态。如果是TRUE,表示不会自动重置,
必防护属性。NU比表示使用预设属性。此属性
须靠程式动作(呼叫ResetEvent())才能将激发状
bIntialState
如为TRUE,表示这个event一开始处於激发状
态。如为FALSE,表示这个event一开始处於非
激发状
lpName
Event物件的名称。任何执行绪或行程都可以根据
这个文字名称,使用此一event物件。
以下,再来看个如何使用的例子:
HANDLE EventHandle;
EventHandle = CreateEvent(NULL, FALSE, FALSE, "Test");
而EventHandle这个东西,就是可以用来等待某事件的触发
而触发的方式,则是利用:
SetEvent(EventHandle);
这样代表这个Event被触发,表示应该要执行某动作
重点是,要检查这个Event应该没办法在主程式中做infinite loop,对吧?
如果你这样做了,
假设这个Event一直都没被触发,你的程式也跟着一起自杀不是吗
所以,这也是为什麽我把Thread提出来讲得原因
这样应该知道该怎麽做了吧,下面就不多做提示了
讲得太明白,就失去了
思考的意义
Thread和Event就讲到这边了,有机会下次见,拜拜。
妈的,恶灵古堡四的电锯乡民真是机车。
--
要
感谢的人太多了,那就
谢天吧
要
改得程式码太多了,那就
改天吧
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.118.41.49