【问题标题】:How can I extend a java TimerTask in Jython and pass parameters to it?如何在 Jython 中扩展 java TimerTask 并将参数传递给它?
【发布时间】:2012-12-19 06:54:03
【问题描述】:

我正在尝试在 Jython 中扩展 TimerTask 以从某些传感器读取数据,然后每隔一秒通过网络发送该数据。为此,我需要将阅读器和服务器对象(以及一些事件对象)传递给TimerTask 对象。当我尝试通过 Timer.schedule 方法执行此操作时,我收到此错误:

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__呢?我也尝试将参数添加到我的TimerTaskrun 方法中,但我得到了同样的结果。

这是我的代码:

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 中以这种方式工作。我究竟做错了什么?

感谢您查看此内容!

【问题讨论】:

  • 我也在想,也许我可以将 TimerTask 创建为 IButtonHandler 的内部类,以便访问 IButtonHandler 的变量。我认为 self.__ 会导致问题,而且我不确定 jython 内部类是如何工作的。

标签: java jython timertask jython-2.5


【解决方案1】:

你的init应该叫__init__

class IButtonTimerTask(TimerTask):

    def __init__(self, reader, server, enterPressed, runComplete):
        ^^    ^^

【讨论】:

  • 我很想为你投票,但我没有足够的声望来投票。犯这种错误我可能不会赚到任何钱......
猜你喜欢
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多