我試圖擴展Jython中的TimerTask
以讀取某些傳感器的數據,然後每隔一秒鐘通過網絡發送這些數據。爲了做到這一點,我需要將讀者和服務器對象(以及一些事件對象)傳遞給TimerTask
對象。當我嘗試通過Timer.schedule
的方法做它,我得到這個錯誤:如何在Jython中擴展Java TimerTask並將參數傳遞給它?
File "C:\Documents\src\iButtonHandler.py", line 61, in run
TypeError: org.python.proxies.iButtonHandler$IButtonTimerTask$1(): expected 0 args; got 4
我收集了Timer.schedule
方法調用TimerTaskObject
的run方法,但爲什麼沒有首先調用__init__
?我也嘗試將這些參數添加到我的TimerTask
的run
方法中,但我得到了同樣的結果。
這裏是我的代碼:
class IButtonTimerTask(TimerTask):
def init(self, reader, server, enterPressed, runComplete):
self.__reader = reader
self.__server = server
self.__enterPressed = enterPressed
self.__runComplete = runComplete
def run(self):
iButtonData = self.__reader.getAllValues()
self.__server.sendData(iButtonData):
if self.__enterPressed.isSet():
self.cancel()
self.__runComplete.set()
class IButtonHandler(threading.Thread):
def __init__(self, port, container, enterPressedEvent, exitEvent):
threading.Thread.__init__(self, name='iButton Handler Thread')
print 'creating ibutton thread'
self.__container = container
self.__reader = IButtonContainerReader(self.__container)
self.__containerId = self.__reader.getID()
self.__server = MyServer(port, name=self.__containerId)
self.__enterPressed = enterPressedEvent
self.__exitEvent = exitEvent
self.__runComplete = threading.Event()
self.start()
def run(self):
print 'ibutton thread running'
if self.__server.listen():
timer = Timer()
timer.schedule(IButtonTimerTask(self.__reader, self.__server, self.__enterPressed, self.__runComplete), 0, 1000)
self.__runComplete.wait()
print 'iButton handler %s exiting' %self.__containerId
timer.cancel()
self.shutDown()
return
我看到,在直Java中你簡單地擴展TimerTask
並在Timer.schedule
方法調用new MyTimerTask(...)
。我似乎無法使它在Jython中以這種方式工作。我究竟做錯了什麼?
謝謝你看看這個!
我也在想,也許我可以爲了有機會獲得IButtonHandler的變量創建一個TimerTask作爲一個內部類的IButtonHandler的。我認爲self .__會導致問題,但我不確定jython內部類如何工作。 – Zobal