QtベースのCDリッパー用のスレッドビルディングブロック(TBB)?
-
12-09-2019 - |
質問
C++ と Qt で CD リッパー アプリケーションを構築しています。複数のトラックを同時にエンコードできるようにアプリケーションを並列化したいと考えています。したがって、トラックのエンコードが「タスク」になるようにアプリケーションを構造化し、これらのタスクをいくつか同時に実行するメカニズムに取り組んでいます。もちろん、スレッドを使用してこれを実現し、独自のタスク キューまたはワーク マネージャーを作成することもできますが、この仕事には Intel の Threading Building Blocks (TBB) の方が優れたツールである可能性があると考えました。ただし、いくつか質問があります。
- WAV ファイルを FLAC、Ogg Vorbis、または Mp3 ファイルにエンコードすることは、tbb::task として適切に機能しますか?チュートリアルのドキュメントには、「スレッドが頻繁にブロックされると、タスク スケジューラの使用時にパフォーマンスが低下する」と記載されています。私のエンコード タスクがミューテックスに対して頻繁にブロックすることはないと思いますが、エンコードするにはディスクから WAV データを読み取る必要があるため、比較的頻繁にディスクにアクセスする必要があります。このレベルのディスク アクティビティは、チュートリアルで説明されている意味で問題がありますか?
- TBB は Qt とうまく連携しますか?Qt スレッドを使用する場合、Qt のシグナル/スロット メカニズムをスレッド間で透過的に使用できます。Qt スレッドの代わりに tbb::tasks を使用している場合も同じでしょうか?他に「落とし穴」はありますか?
ご提供いただける洞察をありがとうございます。
解決
TBBは、その理論的には同じプログラムでQTのスレッドクラスを使用できないものがあってはならない他のスレッド化メカニズムであっても透過的に、うまく動作すると仮定されます。 QTのスレッドをより自然に働くものがある場合は、GUIのように、それらを使用し、TBBのものは、あなたができるか欲しい最高として分離しておく。
私はあなたが現在あなたのデザインを概説として、あなたはTBBを生かしていることがわかりません。あなたは、grossestレベルでファイルを並列化します。 CDはかなり遅いデバイスであるので、あなたは、疑いがあるとして、あなたはあなたが実際に保存するよりも、複数のファイルからのデータの前後に求めて多くの時間を費やすことがあります。
TBBと降圧のための本当の強打は、変換プロセスでありどんなデータおよび/またはタスク並列活用関与させるべきです。あなたは、例えば、ストリームからバイトの任意のブロックを引き出し、前または後に独立したストリームの任意の部分のそれに変換を何でも適用することはできますか?そこに複数のステップがあるに並列化することができる変換?
他のヒント
なぜ Qtの同時に使用していない?