Müzik çalan bir uygulama üzerinde çalışıyorum.
Oynatma sırasında, genellikle aynı konu üzerinde olmaları gerektiğinden, ayrı işlerde her şey olması gerekir. Çağrı:. Örneğin, her biri içinde çalınacak kendi iş parçacığı atanır, böylece bir akor ihtiyacının notları (Düzen netleştirmek için, birlikte duyulmak note.play()
not bitti iskambil kadar iplik donar ve ben üç ihtiyacım bu yüzden aynı anda üç nota duymak için ayrı başlıklar.)
Bu tür bir davranış, bir müzik parçasının çalınması sırasında birçok konu yaratır.
Örneğin, kısa bir melodi ve eşlik eden kısa akor ilerlemeli bir müzik parçası düşünün. Tüm melodi, tek bir iplik üzerinde çalınabilir, fakat akorlarının her birinde üç nota bulunduğundan, ilerlemenin çalması için üç iplik gerekir.
Dolayısıyla, bir ilerlemenin oynatılması için sözde kod şöyle görünür:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
Dolayısıyla, ilerlemenin 4 akoru olduğunu varsayarız ve onu açtıktan 3 notes * 4 chords * 2 times
= 24 dişe göre iki defa çalarız. Ve bu sadece bir kez oynamak için.
Aslında pratikte iyi çalışıyor. Belirgin bir gecikme veya bundan kaynaklanan hatalar fark etmiyorum.
Fakat bunun doğru bir uygulama olup olmadığını veya temelde yanlış bir şey yapıp yapmadığımı sormak istedim. Kullanıcı bir düğmeye her basışında çok fazla iş parçacığı oluşturmak mantıklı mıdır? Değilse, nasıl farklı yapabilirim?
Is it reasonable to create so many threads...
dilin iş parçacığı modeline bağlıdır. Paralellik için kullanılan başlıklar genellikle işletim sistemi düzeyinde ele alınmakta, böylece işletim sistemi bunları birden fazla çekirdeğe eşleyebilmektedir. Bu dişlerin oluşturulması ve arasında geçiş yapılması pahalıdır. Eşzamanlılık için konular (iki görevi bir araya getirmek, her ikisini de aynı anda uygulamak zorunda değilsiniz) dilde / VM düzeyinde uygulanabilir ve üretmek ve arasında geçiş yapmak için 10 ağ soketi ile az ya da çok konuşabilirsiniz. Aynı anda, ancak mutlaka bu şekilde daha fazla CPU verimi almazsınız.