【发布时间】:2017-08-29 22:40:09
【问题描述】:
在 Delphi 10.1 Berlin 中,我正在制作一个 Android 应用程序。我创建了一个这样的计时器:
fTimer := TTimer.Create(nil);
fTimer.Interval := 1;
fTimer.OnTimer := OnTimer;
fTimer.Enabled := True;
在OnTimer 事件中,我只是这样做:
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 毫秒触发一次,而不是每 1 毫秒触发一次。 但是,如果我触摸屏幕并在其周围移动手指,该事件会改为每 1.3-1.5 毫秒触发一次。
谁能向我解释一下这种奇怪的行为?
为什么当我的手指触摸屏幕时,应用程序(或至少是计时器)的反应性更强?如何让应用始终如此被动?
关于J..的言论
我认为这不是电池寿命(但我不确定),因为如果我使用线程而不是像这样的计时器:
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;
然后就ok了,每2ms触发一次事件(没有TThread.synchronize每1ms),这个手指还是不在屏幕上。
【问题讨论】:
-
计时器从不用于记录时间 - 不要让这个名字欺骗了你。
Interval是执行之间的最小延迟。计时器绝不会被锁定到确切的时间。如果您有时间敏感的任务,请使用系统时间,而不是计时器的模糊延迟。 -
@JerryDodge:我不想要完美的精度,但是在手指在屏幕上的 1ms 到没有手指在屏幕上的 10ms 之间,它们之间的差距是巨大的!例如,这会导致滚动问题(delphi 滚动计算是在计时器顶部进行的)。但真正的问题是:当应用程序对屏幕上的手指更具反应性时,最重要的是如何让它始终像这样反应?
-
@Victoria:我不明白?你做了什么研究?我也对这个问题进行了一些研究,但一无所获。我只有这个账号...
-
移动设备只做必要的就可以节省电量。当您直接与他们互动时,他们的反应更快。如果您故意规避平台的本机电源管理策略,那么您最终会得到一个会不必要地耗尽用户电池的应用程序。有更好的方法来解决您的实际问题。
-
@J... 我刚刚更新了关于您的评论的问题。你能看到吗?
标签: android performance delphi firemonkey android-timer