簡體   English   中英

正常運行時間iOS Objective-C - 毫秒級精度

[英]Uptime iOS Objective-C - millisecond precision

我正試圖讓iOS的正常運行時間。 我正在使用mach_absolute_time - 但我發現它在睡眠時暫停了。

我找到了這個片段:

- (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;
}

它成功了。 但是,它整整回來了。 有什么方法可以獲得毫秒數?

內核(顯然)不會存儲其啟動時間的更高分辨率時間戳。

KERN_BOOTTIMEbsd/kern/kern_sysctl.csysctl_boottime函數實現。 它調用boottime_sec

boottime_secbsd/kern/kern_time.c 它調用clock_get_boottime_nanotime ,它有一個很有希望的名字。

clock_get_boottime_nanotimeosfmk/kern/clock.c 硬編碼總是在nanosecs參數中返回0。

如果你想要純粹的Objective-C,試試吧

NSTimeInterval uptime = [[NSProcessInfo processInfo] systemUptime];

NSTimeIntervaldouble的typedef,表示秒。)

我知道這可能為時已晚,但你去了:

+ (NSTimeInterval)uptime {
    struct timeval boottime;
    int mib[2] = {CTL_KERN, KERN_BOOTTIME};
    size_t size = sizeof(boottime);

    struct timeval now;
    struct timezone tz;
    gettimeofday(&now, &tz);

    double uptime = -1;

    if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) {
        uptime = now.tv_sec - boottime.tv_sec;
        uptime += (double)(now.tv_usec - boottime.tv_usec) / 1000000.0;
    }
    return uptime;
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM