2013-02-12 58 views
7

我創建一個MIDI音序器和據我知道初始化序,我需要使用:MidiSystem.getSequencer()很慢

Sequencer sequencer = MidiSystem.getSequencer(); 

但是這將導致我的程序啓動速度非常,非常緩慢對於這一個方法調用最多2分鐘!

任何想法如何解決這一問題? 謝謝

+1

我想知道,你是怎麼理解的,這種方法確實導致你的程序啓動長達2分鐘?您是否在使用時間比較的方法之前/之後添加了一些打印輸出? – Andremoniy 2013-02-14 07:37:34

+0

你可以添加你指的是哪個Java版本?哪個音序器被返回(即名稱,供應商字符串)?我目前正在運行Oracle jdk1.7.0_06 64位,並且我無法重現您的問題(此調用需要幾毫秒)。在我的情況下可能需要一分鐘的時間是將巨大的聲音加載到合成器中。也許你的默認合成器奇怪嗎? MidiSystem.getSynthesizer()是否只需要很長時間? – bluenote10 2013-02-15 07:53:10

+0

在1.6.0_37(Mac Os)中嘗試過,此呼叫需要0.25到4秒;當被調用時,圖標出現在碼頭中。當第一次開始[測試應用](https://gist.github.com/kolen/4990019)時,它會通過聲音輸出產生短暫的巨響。 – kolen 2013-02-19 21:18:45

回答

1

看着MidiSystem.getSequencer()的代碼,它看起來像試圖連接各種事情,試圖連接下一個,如果前一個失敗。這意味着如果所有連接嘗試失敗到最後,可能需要很長時間。

爲了驗證這一理論嘗試使用

序序= MidiSystem.getSequencer(假);

並查看該行是否執行得更快,如果確實如此,則問題是連接到默認合成器所需的時間。

調用getSequencer()的一系列事件時有

  1. 獲得連接到默認設備
  2. 返回音序器連接到默認的合成默認序...
  3. 如果沒有可用的合成或默認無法打開連接到默認接收器。連接是通過從Sequencer獲得Transmitter實例並將其設置爲Receiver來完成的。

這段文字幾乎是逐字的,在javadoc中是什麼,但正如你可以看到有足夠的嘗試創建連接,使呼叫有點慢。