2016-04-14 17 views
0

Ağır işlem yapan birden çok iş parçacığı çalıştıran bir JavaFX uygulamasına sahibim.JavaFX UI Platform.runLater() ile birçok iş parçacığı kullanarak donma

mainThread = new MainThread(mc); 
mainThread.start(); 

: Sorun bir süre UI tamamen donar sonra, ama sadece parçacığı kalanını çoğaltılır benim ana iş parçacığı başlatmak yol Platform.runLater()

ile UI güncellenmesiyle Burada iş parçacığı ana denetleyiciye, bu başvuruyu iş parçacıklarının geri kalanına iletir, böylece bir TextArea öğesine bir şeyler yazdırabilirler.

ana iş parçacığı aynı anda yalnızca 2 alt konuları çoğaltılır, ancak bu iki alt ipler ayarlanabilir evre sayısının (100+) ile ExecutorService kullanın:

Şimdi ipler dosya indirme gibi sürü şeyi yok
executor = Executors.newFixedThreadPool((Integer.valueOf(mainController.getIndexController().getThreadsField().getText()))); 

for(int i = 0; i < newTasks.size(); i++){ 
    Runnable slaveThread = new SlaveThread(dataLink, url); 
    executor.execute(slaveThread); 
} 

ama sanırım bu UI'yi etkilememeli. Arayüzden ara sıra okurlar, ama bu sorun olmamalı.

Platform.runlater() işlevini kullanarak, kullanıcı arabirimi donmuş olamaz.

Platform.runLater(() -> { 
    mainController.getIndexController().writeToConsole(result); 
}); 

Arabirimi değiştiren başka bir kodum olmadığı için, bu sorun olmalıdır. Program çok fazla Platform.runLater() - s yürütüyor, çok mu? Veya fazla ne kadar? Arayüzün benimkinden daha sık güncellendiği ve iyi çalıştığı pürüzsüz kullanıcı arayüzüne sahip başka uygulamalar da var. Sorun ne olabilir? Teşekkürler.

cevap

2

Sorunuzdan emin olmanız imkansız, ancak sanki birçok uygulama için birçok uygulama için FX Application Thread'e Platform.runLater(...) numaralı telefonu arayarak planlanıyormuşsunuz gibi geliyor. Birçok faktöre bağlı olduğu için "kaç kişi çok fazla" yanıt vermiyorsa da, genellikle bunları tüketilebileceklerinden daha sık planlamamalısınız.

Genellikle, planlanmış olan önceki bir güncelleştirme yürütüldüğünde, yalnızca kullanıcı arabirimine yeni bir güncelleştirme zamanlayarak bunu yapabilirsiniz. Bunu yapmak için teknikler için Throttling javafx gui updates'a bakın.

+0

Yani bazı güncellemeler kaybolacak? – Joey

+0

Bazı bireysel güncellemeler gerçekleştirilmeyecek, doğru. Ancak güncellemeniz kullanıcı arayüzünü güncellediğinden, bunları zaten kareler oluşturulduğundan daha sık güncellemek istemezsiniz. Yani Bunu yapmak istemiyorsanız, etiket.setText ("X") "," label.setText ("Y"), "label.setText (" Z ") -" "X" ve "Z" ye ayarlanması - ara güncelleme kullanıcı tarafından asla görülmeyecektir. –

0

UI'nin tamamen donuyor olduğunu söylediğiniz gerçeği, çok fazla Platform.runLater çağrısı kullanmaktan çok ölü kilitleme koşulu gibi geliyor. Ölü kilitleri tespit etmek için kullanılabilecek çeşitli araçlar vardır. Çok fazla Platform.runLater çağrısı kullanmak normalde sistemi yavaşlatır, çünkü bir çağrı oluşturma kuyruğu vardır.