Как реализовать механизм зацикливания, при котором функция вызывает себя, пока не выполнено какое-либо условие, или вызовы функции очереди - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь перевести приложение с python (с TKinter) на Java.Tkinter имеет механизм зацикливания, такой как:

<!-- language: python -->

def checkState():
    if checkCond1():
        root.after_idle(cond1Loop)
    elif checkCond2():
        root.after_idle(cond2Loop)
    elif checkCond3():
        root.after_idle(cond3Loop)
    else:
        print('not found known state...')
        root.update_idletasks() # waits for idle Tk tasks
        root.after_idle(checkState)

def cond1Loop():
    # some checks here, may be looping deeper
    root.after_idle(cond1Loop)


def cond2Loop():
    # some checks here, may be looping deeper
    root.after_idle(cond2Loop)


def cond3Loop():
    # some checks here, may be looping deeper
    root.after_idle(cond3Loop)

root = Tk()
mainWindow = Frame(root)
# some win init here
root.after_idle(checkState)# calls function when no idle tasks
root.mainloop()

Моя первая попытка состояла в том, чтобы реализовать его с помощью таймеров, но не может остановить таймер из-за его собственной функции:

<!-- language: java-->
private void mainLogicLoop(){
    javax.swing.Timer localtimer = new javax.swing.Timer(100, e -> {
        //finding state
        if(checkCond1()){
            System.out.println("I am at cond 1.");
            cond1Loop();
            //here i need to stop this timer,
            //but localtimer is invisible from here.
            //cond1Loop() will run its own timer...
        }else
        if(checkCond2()){
            System.out.println("I am at cond 2.");
            cond2Loop();
            //here i need to stop this timer,
            //but localtimer is invisible from here.
            //cond2Loop() will run its own timer...
        }else
        if(checkCond3()){
            System.out.println("I am at cond 3.");
            cond3Loop();
            //here i need to stop this timer,
            //but localtimer is invisible from here.
            //cond3Loop() will run its own timer...
        }else{
            System.out.println("No known conditions found.");
        }
    localtimer.start();

}

public static void main(String[] args) {
    mainLogicLoop();
}

Пожалуйста,не предлагайте внешние сценарии, такие как Sikuli и зависящие от платформы функции.Мне нужна как бы «чистая и нативная» Java, какой она может быть.

- update -

Использование JDK 1.8, потому что работает на WinXP

1 Ответ

1 голос
/ 19 апреля 2019

Благодаря @ cricket_007 этот механизм зацикливания был легко реализован с помощью ExecutorService.Пример рабочего кода: в конструкторе я создаю сервис ExecutorService service = Executors.newCachedThreadPool(); и в конце каждого цикла вызываю service.submit(() -> loopname());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...