Я работаю над созданием приложения, которое позволяет общаться с очень низкой пропускной способностью через высокочастотные звуковые волны. Я дошел до того, что могу создать частоту и сделать преобразование Фурье (с помощью открытого кода Moonblink для Audalyzer).Android - Планирование событий каждые 10 мс?
Но вот моя проблема: я не могу заставить код работать с правильным временем. Предположим, я хочу, чтобы часть кода выполнялась каждые 10 мс, как я могу это сделать?
Я пробовал использовать TimerTask, но перед выполнением кода, как и до 100 мс, существует огромная задержка.
Я также пробовал этот метод просто путем проверки текущего времени и выполнения только тогда, когда это время истекло. Но есть проблема с задержкой. У вас есть идеи?
Thread analysis = new Thread(new Runnable()
{
@Override
public void run()
{
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);
long executeTime = System.currentTimeMillis();
manualAnalyzer.measureStart();
while (FFTransforming)
{
if(System.currentTimeMillis() >= executeTime)
{
//Reset the timer to execute again in 10ms
executeTime+=10;
//Perform Fourier Transform
manualAnalyzer.doUpdate(0);
//TODO: Analyze the results of the transform here...
}
}
manualAnalyzer.measureStop();
}
});
analysis.start();
Вы пробовали поставить executeTime = System.currentTimeMillis() + 10; после doUpdate()? Таким образом, вы должны установить точную задержку в 10 мс между doUpdates – Renard
Я попытался это сделать, однако, поскольку текущее время иногда превышает время выполнения (из-за сбора мусора и других потоков), он не может возникать с точным шагом в 10 мс , И поскольку я пытаюсь синхронизировать с другим устройством, которое ожидает эти точные приращения, оно не работает полностью. – YasharBahman
, если у вас есть контроль над всем кодом, вы также можете попытаться устранить сбор мусора, используя диспетчер выделения и предварительно распределив все ваши объекты. также обратите внимание, что если вы получите всплеск в doUpdate, который длиннее 10 мс, время будет отключено. – Renard