2013-02-12 59 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中是什么,但正如你可以看到有足够的尝试创建连接,使呼叫有点慢。