我正在尝试为程序添加一个节拍器,这里是它的类
public void playMet() throws IOException
{
int tempo = Integer.parseInt(met_speed.getText());
//tempo = 60/tempo;
double delay = 60/tempo*1000;
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
while(Play.isSelected()){
try {
playSound("Click1.wav");
System.out.println("beep");
Thread.sleep((long) delay);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
t.start();
}
如果我将值设置为60bpm,或者每秒一次,则程序运行正常。如果我把它设置为其他任何东西,它会忽略睡眠。 “system.out.println ..”用于测试,而playSound是一个播放wav文件的类。
不确定我是否忽视了一些明显的东西,或者我是否偏离了我应该做的事情
答案 0 :(得分:4)
你正在做整数除法
double delay = 60/tempo*1000;
因此,如果您将速度设置为100,则60/100为0.对于大于60的值,您的睡眠将始终为0
你应该尝试:
double delay = 60.0 / tempo * 1000.0;
答案 1 :(得分:2)
我建议您使用以下延迟方法:
`
TimeUnit.NANOSECONDS.sleep(100);
TimeUnit.MICROSECONDS.sleep(100);
TimeUnit.MILLISECONDS.sleep(100);
TimeUnit.SECONDS.sleep(100);
TimeUnit.MINUTES.sleep(100);
TimeUnit.HOURS.sleep(100);
TimeUnit.DAYS.sleep(100);`
这些方法易于使用,我也可以在不使用1000的情况下使用它。
)