Sto lavorando a un'applicazione che riproduce musica.
Durante la riproduzione, spesso le cose devono succedere su thread separati perché devono accadere simultaneamente. Ad esempio, le note di un accordo devono essere ascoltate insieme, quindi ad ognuna viene assegnata una propria discussione da riprodurre. (Modifica per chiarire: chiamando note.play()
congela il thread fino a quando la nota è terminata, ed è per questo che Ho bisogno di tre thread separati per avere tre note ascoltate allo stesso tempo.)
Questo tipo di comportamento crea molti thread durante la riproduzione di un brano musicale.
Ad esempio, considera un brano musicale con una melodia breve e una breve progressione di accompagnamento. L'intera melodia può essere riprodotta su un singolo thread, ma la progressione richiede tre thread, poiché ciascuno dei suoi accordi contiene tre note.
Quindi lo pseudo-codice per la riproduzione di una progressione assomiglia a questo:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
Quindi supponendo che la progressione abbia 4 accordi, e la suoniamo due volte, allora stiamo aprendo 3 notes * 4 chords * 2 times
= 24 thread. E questo è solo per giocare una volta.
In realtà, funziona in pratica. Non ho notato alcuna latenza evidente o bug risultanti da questo.
Ma volevo chiedere se questa è una pratica corretta, o se sto facendo qualcosa di fondamentalmente sbagliato. È ragionevole creare così tanti thread ogni volta che l'utente preme un pulsante? In caso contrario, come posso farlo in modo diverso?