2

私は音楽プレーヤーを書いています。外部の音楽ファイルからデータを読み取るとき、振幅情報でバッファを埋めます。このブロックアクションを独自のスレッドに生成するのが理にかなっていると思ったので、runnable内で実行するインターフェイスを追加しました。

public class AudioInterface implements Runnable {

 public void run() 
 {
    AudioManager am = new AudioManager();
    am.play("res/sample2.mp3");
 }
}

これが私の次の質問です:

  • 振幅データをポーリングするために別のクラスからフックを作成するにはどうすればよいですか?JPanelキャンバスに描画されるアルゴリズムを作成するために必要です。
  • 視覚化を可能にするパネルも別のスレッドに配置する必要がありますか?
  • 現在、run()にはファイルの再生のみが含まれていますが、実行アクションは1つしかないため、ポーズやシークなどの他のアクションにこのスレッドをどのように使用しますか。

ありがとう

4

1 に答える 1

3

いくつかの考え:

振幅データをポーリングするために別のクラスからフックを作成するにはどうすればよいですか?JPanelキャンバスに描画されるアルゴリズムを作成するために必要です。

これはSwingプログラムであるため、バックグラウンドスレッドにSwingWorkerを使用し、SwingWorkerの公開/処理メソッドのペアを介して振幅データをプログラムのGUI部分にポンプすることを検討してください。

視覚化を可能にするパネルも別のスレッドに配置する必要がありますか?

ここで注意してください。すべてのSwingコードは、1つのスレッドと1つのスレッド、つまりイベントディスパッチスレッドでのみ呼び出す必要があります。これに関するチュートリアル、Swingの同時実行性をご覧ください。

現在、run()にはファイルの再生のみが含まれていますが、ポーズやシークなどの他のアクションにこのスレッドをどのように使用しますか?

これには「スレッド」を使用せず、オブジェクトのメソッドを呼び出します。

また、AudioManager変数をローカル変数ではなくクラスフィールドとして宣言することをお勧めします。そうしないと、スコープが宣言されたメソッドに制限され、他のコードが相互作用するのを防ぐことができます。

于 2012-10-21T00:44:15.543 に答える