【问题标题】:C++11 std::chrono::steady_clock issue on AndroidAndroid上的C ++ 11 std::chrono::steady_clock问题
【发布时间】:2016-02-10 16:52:52
【问题描述】:

我一直在为 Android 平台制作的应用程序中使用 std::chrono::steady_clock 进行间隔计算。

代码:

// On application start
auto timeSinceEpoch = std::chrono::steady_clock::now().time_since_epoch();

auto timeInSec = std::chrono::duration_cast<seconds>(timeSinceEpoch).count();

log("On Enter Start Time Point - %lld", timeInSec);

输出:

On Enter Start Time Point - 521

现在我关闭手机并重新启动手机。我运行我的应用程序,这次输出是:

On Enter Start Time Point - 114

根据 cppreference.com 的定义

“std::chrono::steady_clock 类表示一个单调时钟。这个时钟的时间点不能随着物理时间的推移而减少。”

当我重启手机时输出值如何?

如果有人遇到过这个问题,请在这里帮助我。谢谢!!

【问题讨论】:

  • 保证是针对steady_clock 类型的特定对象 - 它永远不会降低其价值。您正在比较该类型的两个不同实例。
  • 感谢您的回复。所以基本上 stable_clock 的时代是系统启动对吗?

标签: android c++ c++11


【解决方案1】:

稳定时钟的正式要求是调用now() 的结果发生在另一个调用now() 的结果总是小于或等于第二次调用的结果. happens before 关系仅适用于程序运行中的操作。一个稳定的时钟不需要在程序的不同调用中保持稳定。

【讨论】:

  • 感谢您的快速回复。当我关闭应用程序并在说 1 小时后重新开始时,仍然保持稳定。但是只有在我重新启动手机后,才会失去稳定性。对此有何解释?
  • @mechX -- “不需要”与“不需要”不同。 最有可能的是,now() 调用操作系统中的某些东西来获取当前时间,并且操作系统时钟稳步增加。当您重新启动时,操作系统时钟也会重新启动。
  • 嘿,再次感谢您的解释。这使我的工作有点棘手,因为即使在重新启动后我也需要稳定,而且我“不能使用 system_clock,因为它依赖于挂钟”。对可能的解决方案或解决方法有任何建议吗?
  • @mechX -- 我倾向于在应用程序退出时保存当前时间,然后在应用程序重新启动时加载它并使用先前保存的时间和当前指示的时间之间的差异是时候调整后续时间了。
  • 嘿,Pete,使用 system_clock 的问题是它可以通过更改手机设置中的时间来破解。如果时钟不是单调的,我的解决方案就会失败。
【解决方案2】:

在 Android 上,AFAICT stable_clock 与(来自 Java)System.Clock.elapsedRealtime 相同,在启动时重置为零 -- https://developer.android.com/reference/android/os/SystemClock.html

不过,我完全无法挖掘clock_gettime 的源代码。 https://android.googlesource.com/platform/ndk.git/+/43255f3d58b03cd931d29d1ee4e5144e86e875ce/sources/cxx-stl/llvm-libc++/libcxx/src/chrono.cpp#124 显示它调用clock_gettime(CLOCK_MONOTONIC),但我不确定如何从那里穿透面纱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多