デルファイ10.1ベルリンでは、私はAndroidアプリを作っています。 指が画面に触れたときに、Androidのタイマーがより正確なのはなぜですか?
procedure TMyForm.OnTimer(Sender: TObject);
begin
MyStopWatch.Stop;
Inc(acounter);
if acounter mod 1000 = 0 then
allog('delay', FloatToStr(xStopWatch.Elapsed.TotalMilliseconds));
MyStopWatch := TStopWatch.StartNew;
end;
私はアプリを起動すると、
OnTimer
イベントは10 msごとの代わりに、1ms毎に解雇されています。私は単にこれを行う、
OnTimer
イベントで
fTimer := TTimer.Create(nil);
fTimer.Interval := 1;
fTimer.OnTimer := OnTimer;
fTimer.Enabled := True;
:私はこのようなタイマーを作成しました。 しかし、私が画面に触れ、その上で指を動かすと、、イベントは1.3-1.5ミリ秒ごとに発砲されます。
誰かが私にこの奇妙な行動を説明できますか?
指が画面に触れたときにアプリ(または少なくともタイマー)が反応するのはなぜですか?どのようにしてこのアプリを常に反応させるのですか? Jの発言について
...
私が代わりにこのようなタイマーのスレッドを使用している場合ので、それは私が考える(しかし、イムわからない)baterry人生ではありません。
TThread.createAnonymousThread(
procedure
var MyStopWatch: TstopWatch;
acounter: integer;
begin
acounter := 0;
MyStopWatch := TStopWatch.StartNew;
while True do begin
TThread.synchronize(nil,
procedure
begin
MyStopWatch.Stop;
Inc(acounter);
if acounter mod 1000 = 0 then
allog('delay', FloatToStr(MyStopWatch.Elapsed.TotalMilliseconds));
MyStopWatch := TStopWatch.StartNew;
end);
sleep(1);
END;
end).start;
その後それは大丈夫です、イベントは2ミリ秒ごとに(1ミリメートル毎にTThread.synchronizeせずに)発射され、この指がスクリーン上にあるかどうかはわかりません。
タイマーは時間の経過を記録するために使用されることは決してありません。名前を欺くことはできません。 'Interval'は実行間の最小遅延です。タイマーは決して正確な時間にロックされません。時間の影響を受けやすいタスクがある場合は、タイマーの曖昧な遅延ではなく、システム時間を使用します。 –
@JerryDodge:私は完璧な精度を望んでいませんが、指が画面上にあるときは1ms、画面上に指がないときは10msの間に大きなギャップがあります!これは、例のためのスクロールの問題を引き起こします(デルファイのスクロール計算はタイマーの上部で行われます)。しかし、実際の質問:アプリが画面上の指で反応しているとき、そして最も重要なことは、いつもこれをこう反応させる方法です。 – andrey
@ヴィクトリア:分かりませんか?あなたは何の研究をしましたか?私はこの質問についてもいくつかの調査をしましたが、すべてを見つけることはありません。私はこのアカウントしか持っていません... – andrey