9.15.2009

可以傳遞DWORD資料的 event

CE 的 Event 可以'關聯' 一個DWORD data。

example code , from norains 的 '事件和进程间的数据交换 ' :
# 进程A: 
# DWORD NotifyProc(LPVOID pParam)
# {
# while(TRUE)
# {
# if(IsDataChange() != FALSE)
# {
# //设置关联数据
# SetEventData(hEventNotify,dwData);
#
# PulseEvent(hEventNotify);
# }
# }
# }
#
# 进程B:
# DWORD WaitNotifyProc(LPVOID pParam)
# {
# while(TRUE)
# {
# DWORD dwReturn = WaitForSingleObject(hEventNotify);
# if(dwReturn != WAIT_TIMEOUT)
# {
# //获取关联数据
# dwData = GetEventData(hEventNotify);
# }
# }
# }

從這裡來看, SetEventData/GetEventData的用法有點問題。
因為Set 和 Get 都要分成兩個動作:
  1. SetEventData
  2. PluseEvent

  1. WaitForSingleObject
  2. GetEventData
所以萬一在 WaitForSingleObject 後,GetEventData前被 preempt 掉,讓 A又執行一次 SetEvent Data再 switch 回來,那麼,GetEventData( ) 取得的就是'新'的 data,而不是'上一個' PluseEvent 前 Set 的 Data 了。

而且接下來 又會有一次 PluseEvent。
所以又會再收一次 -- 這樣的結果就是 Get 的 Thread 會收到兩次相同的 EventData 而漏掉 一個 Data。

沒有留言: