[英]Scala 3 with ScalaFX thread related problem
我有一個具有多個屏幕的應用程序和一個需要從某些屏幕獲取 UI 信息並更新其他屏幕的進程。
嘗試了很多方法,但結果總是“不是 Java FX 線程”。 如果不使用某種線程,UI 不會更新由於應用程序的多屏特性(更改不實際),我需要從根本上更改應用程序架構,這就是我不發布任何代碼的原因——這一切都會改變。
我無法解決的是最好的方法,因為任何改變都可能需要大量的工作,我不願意嘗試成功機會很小的事情。
我知道 Platform.runLater 並嘗試將其添加到更新中,但這很復雜並且似乎沒有效果。
我確實有 GitHub 上的代碼 - 這是一個從 Scala 2 開始的個人學習項目,但如果您有興趣學習或指出我的錯誤,我可以提供訪問權限。
希望你度過了一個美好的聖誕節。
問題不在於Platform.runLater沒有工作,因為該進程是在線程中的循環中調用的,並且沒有讓 JavaFX 線程有機會運行。 它似乎只是失敗了——我再次違背了一個假設。
線程從循環中調用方法,該方法在方法設置的條件下終止。
該進程計划模擬 6502 條處理器指令在 2 種模式 run 和 run-slow 中的執行,run-slow 在每條指令執行后運行一個短暫的延遲。
更新是 PC 主屏幕、狀態標志和寄存器內容。 運行(調試)屏幕會更新當前指令顯示並添加其他項目。 在將來。
后跟零字節的 BRK 指令捕獲並將執行模式設置為單步,本質上是一個斷點,盡管將來可以通過調試屏幕設置斷點並恢復斷點的執行原來的內容。 這是為了能夠調試未來的硬件項目——時間和資金允許——畢竟這是一種愛好
事實證明,JavaFX 線程問題僅在寫入 FX 控件時發生,但在讀取時不會發生。 將所有讀取和寫入都放在Platform.runLater中太復雜了,這就是為什么我最初在尋找替代解決方案但現在只需要它來保護寫入變得不那么麻煩了。
在進程循環中調用 Thread.'yield'() 使 Platform.runLater 塊中的代碼能夠在 JavaFX 線程上執行,因此 UI 更新不會出現異常。
Run 方法中的代碼:
val thread = new Thread {
override def run =
while runMode == RunMode.Running || runMode == RunMode.RunningSlow do
executeIns
Thread.`yield`()
if runMode == RunMode.RunningSlow then
Thread.sleep(50) // slow the loop down a bit
}
thread.start
注意因為yield是一個Scala保留字需要引用它!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.