Я получаю периодические сигналы (удары в минуту) от Transmitter и теперь хочу вызывать методы за долю периода, например. отправьте 1/1, 1/2, 1/4, 1/8, 1/16, .. примечания.Синхронизация с битами в минуту/Передача квантованных сообщений
Мое решение для этого - создать поток, выполнить ожидание, а затем выполнить методы. Проблема здесь в том, что прослушивание сигнала, обработка его и отправка его создает задержку в несколько миллисекунд (в зависимости от системы).
Итак, теперь я хочу определить задержку между входящим сигналом и периодическим сигналом потока, и если задержка равна! = 0, остановите текущий поток и запустите новый поток после «bpm-delay» миллисекунд. Как это может быть сделано ?
Иллюстрация:
передатчик сигнала: | ---- | ---- | ---- | ---- |
****** сигнал бегуна: | ---- | ---- | ---- | ---- |
задержка сигнала бегуна на "onePeriod - задержка" миллисекунд: Сигнал
Передатчик: | ---- | ---- | ---- | ---- |
*** "бегун сигнала:. **** | ---- | ---- | ---- | ---- |
Оба сигнала теперь синхронизированы
public class Quantiser implements Receiver{
private int[] bpmsInMillis = new int[4];
private int bpmInMillis=0;
private double smallestNote = 1;
private long period=0;
private long fire=0;
private long prevTimeStamp=0;
private Runnable runny = new Runnable() {
@Override
public void run() {
while(true){
fire = System.nanoTime() + period;
while(System.nanoTime() < fire){} // busy wait
// Call some methods here.
}
}
};
private Thread thread = new Thread(runny);
@Override
public void send(MidiMessage message, long timeStamp) {
// Calculate average bpm
for(int i=0; i<bpmsInMillis.length-1;i++)
bpmsInMillis[i] = bpmsInMillis[i+1];
bpmsInMillis[bpmsInMillis.length-1] = (int) ((timeStamp - prevTimeStamp)/1000);
bpmInMillis = arithmeticMean(bpmsInMillis);
prevTimeStamp = timeStamp;
period = (long) (bpmInMillis * smallestNote * 1000000);
if(!thread.isAlive()) {
thread.start();
}
/*
else{
Calculate delay between signal and thread-signal.
if(delay != 0){
Delay new thread by "bpm - delay" milliseconds.
Stop old thread.
Start new thread.
}
*/
}
@Override
public void close() {
}
Не могли бы вы объяснить, как помочь начать новую тему? –
Поскольку новый поток будет задерживаться, он должен теперь синхронизироваться с входящим сигналом (компенсация задержки будет компенсирована) – user
Что я понял из вашего кода, ваш исполняемый файл фактически не прослушивает сигнал, он просто использует рассчитанный которое может быть изменено извне в любое время. Поэтому неясно, о какой задержке вы говорите. Задержка между чем и что? В любом случае, если есть задержка, ваш бегун может использовать его для настройки периода (подождите дольше или короче). Нет необходимости в новом потоке. –