<marquee width=358>欢迎来到月影社区,希望这里可以成为您美丽的梦幻花园,如果你觉得这里好请分享给您的朋友!- wf66.com</marquee> 北方网通线路南方电信线路将月影社区设置为您的首页将月影社区地址加入到您的收藏栏
月影社区时尚音乐音乐查询IP手机许愿之瓶最新更新文件加密访客留言爱音乐
欢迎您,首页 >> 信息中心 >> 同步问题 Event的使用

请输入您关键字:


同步问题 Event的使用

推荐查看本文HTML版本

记不记得我有一篇文章是关於记忆体对映档来让两个行程共用记忆体的做法?
如果,共用的记体同时有两个Process去做写入的动作,那结果很难想像会如何,所以这
便得使用同步的技巧,现在介绍的是最简单的一种-->Event。
它的做法是:
   1.於系统产生一个Event物件,物件名称相同的话,会指向同一个物件,所以想要有
     两个Event物件,便要有两个不同的名称(这名称以字串来存)。
     Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" _
     (lpEventAttributes As Any, ByVal bManualReset As Long, _
      ByVal bInitialState As Long, ByVal lpName As String) As Long
     一般是用以下的方式呼叫,以产生一个Event物件,并传回hEvent。其中前二个叁数
     的使用请查Win32 help,一般我们如此用便能Work了。第三个叁数传0代表Event物
     件开始时是处於UnSignal的状态,若是1则表Signal

     hEvent = CreateEvent(ByVal 0, 1, 0, "MyEvent")

   2.以WaitForSingleObject() Check Event物件是处於什麽状态,若是Signal,则立
     即结束WaitForSingleObject()指令,而接着执行下一个指令。如果处於UnSignal
     状态,则WaitForSingleObject()指令会一直等待,直到有Thread将该Event物件的
     状态变成Signal或TimeOut才会再执行下一行指令。

     i = WaitForSingleObject(hEvent, 5000) '等5秒,若没有Signal则TimeOut执行下一行指令
     Label1.Caption = i

   3.以 SetEvent(hEvent) 来Signal Event
ResetEvent(hEvent)来UnSignal Event
PulseEvent(hEvent) 来Signale Event後之即UnSignal Event物件
   4.CloseHandle(hEvent)来Close Event物件

这样应还是有些模糊,换个角度来说,这好比红绿灯的做法,CreateEvent便是架一个
红绿灯,所谓处於Signal状态,便是处於绿灯的情况,任何Thread可在执行WaitForSingleObject
後,而立即通行(好比看看目前的灯号是绿灯,可通行),而处於UnSignal状态便是红灯,
不可通行,红 灯时程式如有执行WaitForSingleObject()则程式会停在该行,直到绿灯或Time Out
当然,通不通行一定要使用WaitForSingleObject先来判定,如果设了UnSignal的状态
,而没有WaitForSingleObject,就好比红绿灯仅叁考,而不管它。
[月影社区 http://wf66.com/]
以底下的个Process来看,假设ProcessA先执行,执行一半时,Process B介入,Process A
做某些启始化的动作,要做完後给Process B来读取。就算Process B先做,因一开始Event Object
是处於UnSignal状态,所以它在WaitForSingleObject那一行会一直等,直到Process A
执行到SetEvent()指令,请注意,虽Event物件处於UnSignal,但Process A没有用WaitforsingleObject
指令,也就是它没看红绿灯,直接过去了,等它过去後才设绿灯给Process B看。

Process A
   hEvent = CreateEvent(ByVal 0, 1, 0, "MyEvent")
   '做起始化动作,可能花一些时问,还没有完成方时,Process B起来了

   Call SetEvent(hEvent) '设定绿灯

Process B
  hEvent = CreateEvent(ByVal 0, 1, 0, "MyEvent")
  i = WaitForSingleObject(hEvent, INFINITE) 'INFINITE=&HFFFF 表无限等待
  '做读取动作

另有一件要提出说明的,现在我们都以Process看,事实上应以Thread来看,上面的例子
将Process A --> Thread A,Process B --> Thread B会更好,但VB难做MultiThread,
故一个Process是由一个Thread来做,所以我上面的例子是以Process来看。

而Event做上面这种例子最好,这Event只是一个大家共用的物件,任何人都可以设定它
的灯号,也就是说,Process A设定它为UnSignal时,Process B可设它为Signal,并不一定
要由Process A来做,而且在设定成Signal後,WaitForSingleObject的执行结束,不会[月影社区 http://wf66.com/]
自动设定为UnSignal,所以,只要是Signal,所有的Thread都可以通行,这隐含一个问题
,以共用记意体的例子来说,如果在Signal的情况下,有两个Process同时要做写的动作
,虽WaitForSingleObejct执行後,立即ResetEvent,但分成个指令来做,有可能RestEvent
还没有做,另一个Process紧接着做完WaitforSingleObejct而得知是Signal,如此一来,
就有可能会有问题,这种要使用Mutex,不能使用Event,Mutex能确保同一时间内,只有
一个Thread在做某件事,Event不行,它只能做简单的灯号通行控制。

注:当处於unsigal时即使是同一个Thread使用WaitforsingleObject()同样会造成等待
    的情况

以下提供一个Class来做Event的控制,这程式最好同时有两个执行个体,比较能显示作用
方法:
   Create(字串)  产生一Event物件
   Signal UnSignal PulseSignal      设定 Event的状态
   ChkSignal  Check Event的状态 1: signal   0:因unsignal造成TimeOut
   DelEvent   Close Event
属性
   TimeOut 设定ChkSignal Time Out的时间,单位千分之一秒

'以下在TEvent.ClsOption ExplicitConst INFINITE = &HFFFFConst ERROR_ALREADY_EXISTS = 183&Const WAIT_TIMEOUT = &H102Private Declare Function CreateEvent Lib "kernel32" Alias "CreateEventA" _
(lpEventAttributes As Any, ByVal bManualReset As Long, _
ByVal bInitialState As Long, ByVal lpName As String) As Long
Private Declare Function SetEvent Lib "kernel32" (ByVal hEvent As Long) As LongPrivate Declare Function ResetEvent Lib "kernel32" (ByVal hEvent As Long) As LongPrivate Declare Function PulseEvent Lib "kernel32" (ByVal hEvent As Long) As LongPrivate Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate hEvent As LongPrivate m_TimeOut As LongPublic Function Create(ByVal EventName As String) As LongIf EventName = "" Then Create = -1 Exit FunctionEnd IfIf hEvent <> 0 Then Create = 0 Exit FunctionEnd IfDim i As LonghEvent = CreateEvent(ByVal 0, 1, 0, EventName)If i = 0 Then Create = 1End IfEnd FunctionPublic Sub DelEvent() Call CloseHandle(hEvent) hEvent = 0End SubPublic Sub Signal()Call SetEvent(hEvent)End SubPublic Sub PulseSignal()Call PulseEvent(hEvent)End SubPublic Sub UnSignal()Call ResetEvent(hEvent)End SubPublic Function ChkSignaled()If hEvent = 0 Then ChkSignaled = -1 Exit FunctionEnd IfDim i As Longi = WaitForSingleObject(hEvent, m_TimeOut)If i = 0 Then ChkSignaled = 1Else If i = WAIT_TIMEOUT Then ChkSignaled = 0 Else ChkSignaled = -1 End IfEnd IfEnd FunctionPublic Property Get TimeOut() As LongTimeOut = m_TimeOutEnd PropertyPublic Property Let TimeOut(ByVal vNewValue As Long)If vNewValue < 0 Then vNewValue = 0End Ifm_TimeOut = vNewValueEnd PropertyPrivate Sub Class_Initialize()m_TimeOut = INFINITEEnd SubPrivate Sub Class_Terminate()Call DelEventEnd Sub

'以下在Form 需3个Command Button 一个labelOption ExplicitDim aa As New TEventPrivate Sub Command1_Click()aa.SignalEnd SubPrivate Sub Command2_Click()aa.UnSignalEnd SubPrivate Sub Command3_Click()Dim i As Longaa.TimeOut = 5000i = aa.ChkSignaledLabel1.Caption = "等待中"DoEventsIf i = 1 Then Label1.Caption = "绿灯了"Else Label1.Caption = "Time Out了"End IfEnd SubPrivate Sub Form_Load()aa.Create ("MyEvent")End Sub

同步问题 Event的使用 2006-9-18
转到本主题第:[ 1 ]
相关评论

暂无评论

总计0页 [ ]上一页 下一页
发表评论(揪错)
呢称: * 您尚未登陆,请登录
来自: *
内容:
 

(为防止非法信息,您的言论提交后需要审核才能正常显示)

文学
精品文萃 情感天地 言情小说
网络小说 玄幻小说 悬疑恐怖
武侠小说 古典品谈 外国名著
儿童文学 会员原创 学习园地
杂谈其它
娱乐
爆笑网文 星座占卜 影音动漫
娱乐新闻 影视剧情
诗词
青竹诗歌 个人诗集 宋词雅赏
全唐诗录
新闻
国际新闻 国内新闻 科技新闻
体育新闻
图片
图文专区 艺术长廊 桌面壁纸
精品素材 像素图片
漫画
单幅漫画 爆笑四格 连环漫画
电脑
电脑入门 图形图像 编程开发
游戏
我爱Q宠 最新攻略 最新秘籍
游戏新闻 技巧心得
经济
帕格节电 财经资讯 股市证券
生活
百科知识 外语学院 潮流时尚
健康医疗 宠物花卉 汽车地带
行走天下
美食
面食甜点 家常菜品 药膳食疗
美食天下 烹饪技巧 松辽风味
燕京风味 巴蜀风味 滇黔风味
赣江风味 徽皖风味 闽台风味
齐鲁风味 中州风味 岭南风味
荆楚风味 三晋风味 淞沪风味
苏扬风味 潇湘风味 钱塘风味
民族风味 素斋仿荤
营销
管理杂谈 谈经论道 培训激励
经营战略 职场生涯 公关交际
关于我们版权声明本站导航友情连结作品演示 TOP↑
本论坛言论纯属发表者个人意见,与£月影社区£立场无关。
禁止发布任何色情/政治/反动相关信息让我们共同来营造一个属于我们的梦幻家园
Copyright ©2001-2006 MoonShadow. All rights reserved.  Version 4.0  Licence 2006.4.2
建站天数:6210天 本站基于ASP+JS构建,完全自主开发,版权归属月影社区 管理员QQ:23165062 Time:78ms