使用fixedRateTimer时,Kotin应用程序不会停止(即使关闭了窗口)

时间:2019-09-24 12:34:33

标签: kotlin tornadofx

我在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 :(得分:2)

您要取消Timer任务,但不取消定时器。要么传递daemon = true来创建守护线程,要么确保保存从Timer调用返回的fixedRateTimer()实例,并在某个时候调用cancel以停止该守护进程。非守护进程线程在退出之前运行计时器。

有守护程序线程运行时,JVM将退出,但有非守护程序线程运行时,JVM将退出。