- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的 iOS 应用程序需要一个始终与我的服务器时钟同步的自定义时钟。所有的同步逻辑都完成了。
我的时钟基于 mach_absolute_time(),您可以从中计算自设备启动以来耗时。问题是当设备进入休眠模式时(通过按下屏幕锁定键并且没有应用程序在后台运行),马赫时间滴答暂停。当电话被唤醒时,马赫时间滴答恢复,但它不会考虑电话已经休眠的时间。
这是我计算自启动以来耗时的方式(但它不会考虑设备休眠的时间)
- (long long) elapsedTimeMillis {
uint64_t elapsedTimeNano = 0;
mach_timebase_info_data_t timeBaseInfo;
mach_timebase_info(&timeBaseInfo);
elapsedTimeNano = mach_absolute_time() * timeBaseInfo.numer / timeBaseInfo.denom;
return (long long)(elapsedTimeNano / 1000000);
}
这有完全相同的结果:
- (long long) elapsedTimeMillis {
clock_serv_t cclock;
mach_timespec_t mts;
host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock);
clock_get_time(cclock, &mts);
mach_port_deallocate(mach_task_self(), cclock);
return mts.tv_nsec / 1000000 + mts.tv_sec * 1000;
}
NSDate、CFAbsoluteTimeGetCurrent() 或类似的东西不是一个选项,因为它们会受到同步或用户手动更改的设备时间的影响。
在 iOS 中,有什么方法可以让一个不会来回跳动的不间断滴答作响的时钟计时?
最佳答案
这就是诀窍:
参见:Getting iOS system uptime, that doesn't pause when asleep
- (time_t)uptime
{
struct timeval boottime;
int mib[2] = {CTL_KERN, KERN_BOOTTIME};
size_t size = sizeof(boottime);
time_t now;
time_t uptime = -1;
(void)time(&now);
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)
{
uptime = now - (boottime.tv_sec);
}
return uptime;
}
自上次启动后返回 SECONDS。设备 sleep 不会影响它,电话时间同步或用户更改电话时间也不会。不幸的是,它不返回毫秒或纳秒。
关于除 mach_absolute_time() 之外的 iOS 真正的单调时钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817311/
关于 Darwin,POSIX 标准 clock_gettime(CLOCK_MONOTONIC)定时器不可用。相反,最高分辨率的单调定时器是通过 mach_absolute_time 获得的。来自
我正在尝试在 iOS 上优化一个函数(FFT),并且我已经设置了一个测试程序来计算它在数百次调用中的执行时间。我在函数调用前后使用 mach_absolute_time() 来计时。我正在运行 iOS
我使用此代码来跟踪上次重新启动: + (float) secondsSinceLastReboot{ return ((float)(mach_absolute_time())) * ((f
我的 iOS 应用程序需要一个始终与我的服务器时钟同步的自定义时钟。所有的同步逻辑都完成了。 我的时钟基于 mach_absolute_time(),您可以从中计算自设备启动以来耗时。问题是当设备进入
我正在为 OS X (Obj-C/Cocoa) 编写一个应用程序,它运行模拟并向用户显示结果。在一种情况下,我希望模拟“实时”运行,以便用户可以观看它以与现实生活中相同的速度运行。模拟以特定时间步长
我的应用程序使用 mach_absolute_time 计算自上次触摸事件以来的滴答声,并在超过 10 分钟的空闲时间限制时将用户注销。 这在 iOS 6 上一切正常,但我注意到它在 iOS 7 上表
我是一名优秀的程序员,十分优秀!