私は、高周波音波による非常に低い帯域幅の通信を可能にするアプリケーションの作成に取り組んでいます。私は周波数を作り、フーリエ変換を行うことができるようになった(MoonblinkのオープンソースコードAudalyzerの助けを借りて)。Android - 10msごとにイベントが発生するようにスケジュールする
私の問題は次のとおりです。コードを正しいタイミングで実行することができません。 10msごとにコードを実行したいとしましょう。これをどうやって行うのですか?
私はTimerTaskを使用しようとしましたが、実際にコードが実行されるまでには最大100msの遅延があります。
また、現在の時間にpingを実行し、その時間が経過したときに実行するだけでこの方法を試しました。しかし、まだ遅延の問題があります。皆さんはどんなアイデアを持っていますか?
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()の後に?この方法では、doUpdatesの間に10ミリ秒の正確な遅延が必要です – Renard
しかし、ガベージコレクションや他のスレッドが実行されているために現在の時刻が実行時よりも高い場合がありますので、最初に試しました。正確に10ミリ秒単位で発生しません。私はこれらの正確な増分を期待している別のデバイスと同期しようとしているので、完全には機能しません。 – YasharBahman
すべてのコードを管理できる場合は、割り振りトラッカーを使用してガベージコレクションを排除し、すべてのオブジェクトを事前に割り当てることもできます。また、あなたが10msよりも長いdoUpdateでスパイクを取得すると、タイミングがオフになることにも注意してください。 – Renard