Приложение Kotin не остановится при использовании fixedRateTimer (даже когда окно закрыто) - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть простое приложение в Kotlin, которое рисует прямоугольник, а затем использует fixedRateTimer для обновления местоположения прямоугольника 30 раз в секунду.У меня проблема в том, что когда я закрываю окно с прямоугольником, приложение продолжает работать, и мне нужно нажать на красный квадрат внутри Intellij, чтобы фактически остановить его.

Я пытался отменить fixedRateTimer перед тем, как закрыть окно, но приложение все еще работает, оно просто ничего не делает.Если я запускаю приложение без fixedRateTimer, оно просто отображает квадрат, а затем, когда я закрываю окно, оно останавливает приложение.

import javafx.scene.paint.Color
import tornadofx.*
import kotlin.concurrent.fixedRateTimer

class MyApp: App(MyView::class)

class MyView : View() {

    override val root = stackpane {
        group {
            rectangle {
                fill = Color.LIGHTGRAY
                width = 600.0
                height = 480.0
            }

            val myRect = rectangle {
                fill = Color.BLUEVIOLET
                width = 30.0
                height = 30.0
                x = 100.0
                y = 100.0
            }

            fixedRateTimer("default", false, 0L, 1000/30) {
                myRect.x += 1
                if(myRect.x > 200) this.cancel()
            }
        }
    }
}

1 Ответ

0 голосов
/ 24 сентября 2019

Вы отменяете свою TimerTask, но не таймер.Либо передайте daemon = true, чтобы создать поток демона, либо убедитесь, что вы сохранили экземпляр Timer, возвращенный из вызова fixedRateTimer(), и в какой-то момент вызовите cancel на нем, чтобы не запускать таймер потоку, не являющемуся демоном.перед выходом.

JVM завершит работу, когда запущены потоки демона, но не при наличии потоков, не являющихся демонами.

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