Kotlin TornadFX FXTask OutOfMemoryError

Kotlin TornadFX FXTask OutOfMemoryError,kotlin,tornadofx,Kotlin,Tornadofx,所以我有一段有趣的代码,我遇到了OutOfMemory错误 所以我的问题是,我在我的searchThread中创建了新的线程,这些线程正在再次搜索。这显然造成了OutOfMemoryError,但我想使用TornadoFX代码只是为了解决这个问题,没有任何运气 searchThread = runAsync { while (!searchThread.isCancelled) { runAsync { // Searching f

所以我有一段有趣的代码,我遇到了OutOfMemory错误

所以我的问题是,我在我的searchThread中创建了新的线程,这些线程正在再次搜索。这显然造成了OutOfMemoryError,但我想使用TornadoFX代码只是为了解决这个问题,没有任何运气

searchThread = runAsync {
    while (!searchThread.isCancelled) {
            runAsync {
                // Searching for Sth
            } ui {
                // Updating UI 
            }
        }
    }
}

如果我的搜索线程中的runAsync仍在运行,那么我如何获取它,以便跳过创建新线程?

你正在做的是在一个紧密的循环中创建新任务,因此显然你会耗尽内存。对嵌套的
runAsync
的调用不会等待,只需再次执行,直到条件为false为止


删除内部的
runAsync
,然后做任何你想做的事情,然后调用
runLater
,如果你想更新UI线程上的内容。

你正在做的是在一个紧密的循环中创建新任务,因此显然你会耗尽内存。对嵌套的
runAsync
的调用不会等待,只需再次执行,直到条件为false为止


删除内部的
runAsync
,然后做任何你想做的事情,然后调用
runLater
,如果你想更新UI线程上的内容。

我想我理解你的问题。您的目标是只有一个搜索线程在运行时不会被调用。正如Edvin所说,循环调用异步线程是非常糟糕的。更不用说,嵌套线程甚至可能没有终止条件。这将是一个简单的解决方案,但这不是更有意义吗

val searchTask: Task<YourReturnType>? = null
private fun search() {
   if(searchTask?.isRunning != true) {
      searchTask = runAsync {
         //Do your search thread things
      } ui { result ->
         //do things with your UI based on your result
      }
   }
}
val搜索任务:任务?=无效的
私人趣味搜索(){
if(searchTask?.isRunning!=真){
searchTask=runAsync{
//做你的搜索线程的事情
}ui{result->
//根据结果对UI进行操作
}
}
}
类似地,如果您想用新的搜索线程替换旧的正在运行的搜索线程,可以尝试以下操作:

val searchTask: Task<YourReturnType>? = null
private fun search() {
   if(searchTask?.isRunning == true) {
      searchTask?.cancel()
      //You should probably do something to check if the cancel succeeded.
   }
   searchTask = runAsync {
      //Do your search thread things
   } ui { result ->
      //do things with your UI based on your result
   }
}
val搜索任务:任务?=无效的
私人趣味搜索(){
if(searchTask?.isRunning==true){
searchTask?.cancel()
//您可能应该做一些事情来检查取消是否成功。
}
searchTask=runAsync{
//做你的搜索线程的事情
}ui{result->
//根据结果对UI进行操作
}
}

我想我理解你的问题。您的目标是只有一个搜索线程在运行时不会被调用。正如Edvin所说,循环调用异步线程是非常糟糕的。更不用说,嵌套线程甚至可能没有终止条件。这将是一个简单的解决方案,但这不是更有意义吗

val searchTask: Task<YourReturnType>? = null
private fun search() {
   if(searchTask?.isRunning != true) {
      searchTask = runAsync {
         //Do your search thread things
      } ui { result ->
         //do things with your UI based on your result
      }
   }
}
val搜索任务:任务?=无效的
私人趣味搜索(){
if(searchTask?.isRunning!=真){
searchTask=runAsync{
//做你的搜索线程的事情
}ui{result->
//根据结果对UI进行操作
}
}
}
类似地,如果您想用新的搜索线程替换旧的正在运行的搜索线程,可以尝试以下操作:

val searchTask: Task<YourReturnType>? = null
private fun search() {
   if(searchTask?.isRunning == true) {
      searchTask?.cancel()
      //You should probably do something to check if the cancel succeeded.
   }
   searchTask = runAsync {
      //Do your search thread things
   } ui { result ->
      //do things with your UI based on your result
   }
}
val搜索任务:任务?=无效的
私人趣味搜索(){
if(searchTask?.isRunning==true){
searchTask?.cancel()
//您可能应该做一些事情来检查取消是否成功。
}
searchTask=runAsync{
//做你的搜索线程的事情
}ui{result->
//根据结果对UI进行操作
}
}