私は音楽を再生するアプリケーションに取り組んでいます。
再生中は、同時に発生する必要があるため、多くの場合、別々のスレッドで発生する必要があります。例えば、一緒に聞くことにする和音必要のノートは、それぞれがで再生する独自のスレッドが割り当てられているので(編集明確にする:。呼び出しはnote.play()
、ノートの再生が完了するまでスレッドをフリーズする、と私は3を必要とする理由です別々のスレッドで同時に3つのノートを聞くことができます。)
このような動作は、音楽の再生中に多くのスレッドを作成します。
たとえば、短いメロディーと短いコード進行を伴う音楽を考えてみましょう。メロディ全体を1つのスレッドで再生できますが、進行には3つのスレッドが必要です。各コードには3つの音符が含まれているためです。
したがって、進行を再生するための擬似コードは次のようになります。
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
したがって、プログレッションには4つのコードがあり、3 notes * 4 chords * 2 times
24スレッドを開くよりも2回コードを再生すると仮定します。そして、これは一度だけ再生するためのものです。
実際には、実際にはうまく機能します。顕著な遅延や、これに起因するバグに気付きません。
しかし、私はこれが正しい慣行なのか、それとも根本的に間違っているのかを尋ねたかったのです。ユーザーがボタンを押すたびに非常に多くのスレッドを作成するのは妥当ですか?そうでない場合、どうすれば異なる方法で行うことができますか?
Is it reasonable to create so many threads...
言語のスレッドモデルに依存します。並列処理に使用されるスレッドは、OSレベルで処理されることが多いため、OSはそれらを複数のコアにマップできます。このようなスレッドは、作成および切り替えに費用がかかります。並行性(2つのタスクをインターリーブし、必ずしも両方を同時に実行する必要はありません)のスレッドは、言語/ VMレベルで実装でき、生成と切り替えを行うために非常に「安価」にすることができます。同時に、しかし、あなたは必ずしもより多くのCPUスループットをそのように得るとは限りません。