イベントのストリームが記録されています(たとえば、 でArrayList<InputEvent>
ソートされていInputEvent.getWhen()
ます)。連続するイベント間の時間差は、数十ミリ秒程度になる場合があります。
私の目標は、記録されたストリームをできるだけ正確に実行 (「再生」) することです。つまり、最初のイベントInputEvent firstEvent
をlong startTime = System.currentTimeMillis()
で、2 番目のイベントを で、というように実行startTime + (secondEvent.getWhen() - firstEvent.getWhen())
します。
もちろん、最も正確な方法は次のとおりです。
execute(ArrayList<InputEvent> stream) {
long startTime = System.currentTimeMillis();
long firstTime = stream.get(0).getWhen();
for (InputEvent e : stream) {
while System.currentTimeMillis() <
startTime + e.getWhen() - firstTime) { }
executeEvent(e);
}
}
一方、これは非常にCPUを消費するアプローチです。
execute(ArrayList<InputEvent> stream) {
long lastWhen = strem.get(0).getWhen();
for (InputEvent e : stream) {
try {
Thread.sleep(e.getWhen() - lastWhen);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
executeEvent(e);
lastWhen = e.getWhen();
}
}
CPUの方がはるかに優れていますが、「システムタイマーとスケジューラの精度と精度の影響を受けます」( http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#sleep(長い) )。
TimerTaskExecutor も検討しましたが、Thread.sleep も使用しており、同じ主観的な問題に苦しんでいると思います。
問題は、ストリームの予期しないフローを引き起こすシステム依存の精度を心配する必要があるかどうかです。また、CPU と精度を交換して、私が示した 2 つの例の間のどこかに到達する方法はありますか?