Bir UI (ayrıca Swing'de) aracılığıyla tetiklenmesini istediğim bir Scala programı yazdım. Sorun, tetiklediğimde, UI arka plan programı tamamlanana kadar askıda kalıyor. Bunun üstesinden gelmenin tek yolunun, programın başka bir iş parçacığı/aktörde çalışıp, kullanıcı arabirimini gerektiği gibi güncellemesini sağladığını düşünmek zorundayım. Güncelleme, şu anda işlenmekte olan dosyayı ve bir ilerleme çubuğunu gösteren bir durum çubuğu içerecektir.Swing
Scala oyuncuları kullanımdan kaldırıldığı için, bir tür temel çoklu iş parçacığı çalıştırmak için Akka'yı geçmeye çalışırken zor bir zaman geçiriyorum. Akka web sitesinde verilen örnekler de oldukça karmaşıktır.
Fakat bundan daha fazlası, kafamı bu soruna nasıl gireceğimi anlatmak zor. Ne kadar gelebilir geçerli:
- Arkaplan programı
- UI
Adım 3 olan bir şeyi güncellemek için UI söyler başka aktör var ana programlarından biri bir aktör olarak çalışır Beni ne karıştırıyor? Arabirimdeki bazı değişkenleri kilitlemeden UI'ye nasıl söyleyebilirim?
Ayrıca, bu sorunun daha önce çözüldüğünden eminim. Aynısı için herhangi bir örnek kod çok takdir edilecektir.
=======================
DÜZENLEME: Aktörler kullanmanın
yerine benim için çalıştı Ne, benzer Futures kullanılan yol pagoda_5b onun cevabını açıkladı:
Taşı durum çubuğu ve def top
dışına ilerleme çubuğu ve yapmak onları küresel değişkenler:
object MyGUIProject extends SimpleSwingApplication {
val txtStatus = new Label //Global
val progressBar = new ProgressBar //Global
def top = new MainFrame {
...
}
}
Çağrı ı cl bir gelecekte arka plan işlemi Eğer yeni bir Konu uzun görevi çalıştırmak ve sadece emin yapabilir basit bir şey gerekiyorsa
def updateStatus(txt: String) = {
val fut = future {
Swing.onEDT {
txtStatus.text = txt
}
}
}
def doLongBackgroundProcess(str:String) = {
val taskList = getTasks(str)
taskList foreach {x=>
updateStatus("Currently doing task: " + x)
//Start doing it
}
}
Scala programınızı UI'den başlatmak için programınızın EDT'de çalışmadığından emin olun. SwingWorker, bu konudaki çalışmayı kolaylaştırabilir veya 'Executors' kullanabilirsiniz. "Swing'de Eşzamanlılık" bölümüne bakın: http://stackoverflow.com/tags/swing/info –
Son derece ilgili http://stackoverflow.com/questions/13516752/using-opengl-with-akka-actors-guaranteeing-a- tekil-thread-is-a-specific-için- –
Bkz. ['SwingWorker çalışıyor '] (http://stackoverflow.com/a/11546203/597657). –