2010年2月3日 星期三

多個event handler接收同一個event的執行結果

panda3d的event可以參考
http://www.panda3d.org/wiki/index.php/Event_Handlers
以下例子是測試多個event handler接收同一個event的執行結果。

from direct.showbase import DirectObject
import direct.directbase.DirectStart

class EventHandler(DirectObject.DirectObject):
    def __init__(self,id):
        self.accept('test',self.eventHandle)
        self.id = id
    def eventHandle(self):
        print "eventHandle in EventHandler(%d)"%(self.id)

objectList = [EventHandler(i) for i in xrange(10)]
messenger.send('test')
run()

執行結果如下:

eventHandle in EventHandler(9)
eventHandle in EventHandler(8)
eventHandle in EventHandler(2)
eventHandle in EventHandler(7)
eventHandle in EventHandler(1)
eventHandle in EventHandler(6)
eventHandle in EventHandler(0)
eventHandle in EventHandler(5)
eventHandle in EventHandler(4)
eventHandle in EventHandler(3)

先產生10個不同的EventHandler物件,它們接收同一個event 'test'。
以messenger.send('test')發出event 'test'之後,這10個EventHandler物件都收到這個event,並執行各自的call back function。
從執行結果可以看到這10個EventHandler物件並不是依照被產生的順序接收到event,但每次執行的順序相同。

用event的方式可以分離產生event的物件,與執行此event的call back function物件。產生event的物件不必知道call back function函數名稱(參照),執行call back function的物件可以在執行期動態的指定(accept)或取消(ignore)對應event name的call back function,而不用改變產生event的物件。
缺點也在於它的優點,event機制如同全域變數,當兩個產生event的物件誤用了相同的event name時,會呼叫到其他接收相同event name的call back function,造成意外的錯誤。另外一個缺點在於,無法輕易的從產生event的地方得知此event的call back function為何,它可能藏在任何物件中,或是不存在。

沒有留言: