6

たとえば、Java APIからステートマシンを起動する必要があるため、このスレッドをJythonで再現したいと思います。Jythonに関する知識はあまりありません。どうやってやるの?

Thread thread = new Thread() {
    @Override
    public void run() {
        statemachine.enter();
        while (!isInterrupted()) {
            statemachine.getInterfaceNew64().getVarMessage();
            statemachine.runCycle();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                interrupt();
            }
       }            
    }
};
thread.start();

だから私はこのようなことを試みています:

class Cycle(Thread, widgets.Listener):
    def run(self):
        self.statemachine = New64CycleBasedStatemachine()
        self.statemachine.enter()
        while not self.currentThread().isInterrupted():
            self.statemachine.getInterfaceNew64().getVarMessage()
            self.statemachine.runCycle()
            try: 
                self.currentThread().sleep(100)
            except InterruptedException: 
                self.interrupt()
        self.start()

foo = Cycle()
foo.run()
#foo.start() 

PS:私はすでにfoo.run()の下でコメントされていることをやろうとしました

私は何が間違っているのですか?

4

1 に答える 1

2

さて、start()メソッド内からメソッドを呼び出しているという事実はさておきrun()、これは本当に悪い考えです。スレッドが開始されると、もう一度開始しようとすると、スレッド状態の例外が発生し、それを脇に置いて、問題は、おそらく、JavaではなくJythonスレッドライブラリを使用していることです。

次のようにインポートすることを確認した場合:

from java.lang import Thread, InterruptedException

それ以外の

from threading import Thread, InterruptedException

また、上記で引用した問題を修正すると、コードが正常に実行される可能性があります。

Jythonのthreadingライブラリを使用するには、次のようにコードを少し変更する必要があります。

from threading import Thread, InterruptedException
import time

class Cycle(Thread):
    canceled = False

    def run(self):
        while not self.canceled:
            try:
                print "Hello World"
                time.sleep(1)
            except InterruptedException:
                canceled = True

if __name__ == '__main__':
    foo = Cycle()
    foo.start()

これは私にとってはうまくいくようです。

于 2012-07-13T20:54:20.857 に答える