- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我正在实现一个时钟,并且我想最小化每单位时间的唤醒次数。所以,我只想在整分钟被叫醒(当我需要更新显示时)。在 C(或 C++)中执行此操作(最好是可移植的)的最佳方法是什么?
最佳答案
C++03 和 C07 标准并没有真正提供任何可移植的方法来执行此操作。如果您不能依赖较新的编译器,那么几乎唯一合理的可移植选择可能是 POSIX 线程(下文会详细介绍)。
在 C++11 下,您可以创建一个线程,并使用 std::sleep_until
,或者(如果您愿意,出于某种原因)std::sleep_for
.更喜欢后者的一个原因是对 C 的可移植性。C1x 有一个 thrd_sleep
函数,它本质上类似于 std::sleep_for
,所以它可能更容易使用两者功能相同。
可移植性(在这种情况下)可能很难定义。这些函数在 C++ 标准和 C 草案中,但它们显然都是非常新的,因此很难猜测您关心的编译器是否实际实现了它们。同时,它们非常紧密地基于 pthreads,因此与大多数新的和不同的相比,它们已经(或即将)实现的可能性更大。
如果您愿意将自己限制在 C++ 中,您还可以考虑 Boost.thread .它与标准中的内容非常相似,但它已经适用于几乎所有主要编译器和平台。
如上所述,另一种可能性是直接使用 POSIX 线程。从理论上讲,它可能不那么便携(至少从长远来看),但实际上它现在可能至少是便携的——特别是,它可能可以移植到你真正关心的所有平台上,这是大多数真正重要的事情。显然,它们在基本上所有类 Unix 平台上都可用,而且还有一个 port to Win32。 .
我可能应该添加一个警告,我认为这是一个很小的警告:这些都不能真正保证在“准确时间”运行。它们几乎可以保证您的线程至少会按照您指定的时间休眠,但也可以更长——at
和 cron
也是如此。大多数典型的操作系统都不是“实时”的,因此基本上任何在准确时间运行的尝试都是没有希望的,除非您非常松散地定义“准确”。大多数人主要感兴趣的是距离足够近,以至于它看起来和用户看起来是正确的,所以任何比十分之一秒左右更准确的东西都是不必要的。在那种情况下,您通常可以做得很好(尽管如果系统负载真的很重,即使这样也可能成为问题)。
关于c++ - 在准确的时间运行代码,la crond/atd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7837481/
我有一个运行 busybox 的嵌入式设备。该设备已安装并运行 crond,但没有 atd 守护程序。我需要安排任务在给定时间运行(只运行一次,而不是定期运行)。我知道,“kosher”方法是使用 a
假设我正在实现一个时钟,并且我想最小化每单位时间的唤醒次数。所以,我只想在整分钟被叫醒(当我需要更新显示时)。在 C(或 C++)中执行此操作(最好是可移植的)的最佳方法是什么? 最佳答案 C++03
Stack Overflow 上的第一篇文章。在这个问题上被困了几个小时。 我想要查找“实际出发时间”(ATD) 与“计划出发时间”(STD) 相差在负 10 分钟内的条目。这两个字段都是 TIME
我正在尝试使用 Linux 工具“at”安排 shell 脚本的执行。shell 脚本 (video.sh) 如下所示: #!/bin/sh /usr/bin/vlc /home/x/video.mk
当使用sudo pip3 install atd尝试下载Python 3.6的“截止日期后”模块atd时,出现以下错误: Failed to build atd Installing collecte
我正在尝试制作 IVR 系统 GSM 调制解调器。我已完成使用下面的代码调用号码 SerialPort SP = new SerialPort("COM3"); SP.BaudRate = 9600;
我想减小用 MS Visual Studio C++ 编写的 win32 应用程序的大小,并且我还想保证在所有 Windows 版本(没有 Visual C++ Redistributable Pac
我正在使用 eclipse,在更新 android SDK (rev = 23) 之后我的问题开始了。 所以 SDK (rev = 23) 需要 ATD 23 好的没问题所以我只需转到帮助 > 安装新
我是一名优秀的程序员,十分优秀!