Windows 7 VS 2010 的时间规格转换

Conversion of timespec for Windows 7 VS 2010

我正在尝试为 Windows 7 构建 OpenVDB 查看器并遇到了这行代码:

secs = fabs(secs);
int isecs = int(secs);
struct timespec sleepTime = { isecs /*sec*/, int(1.0e9 * (secs - isecs)) /*nsec*/ };
nanosleep(&sleepTime, /*remainingTime=*/NULL);

不幸的是,我不知道这段代码的确切含​​义,因为我需要使其与 VS2010 编译器兼容才能构建它。 那么,我能知道这段代码或其他一些我可以用来轻松编辑它的库的等价物吗?

假设 secs 是一个浮点值,以秒为单位给出线程应休眠的时间,例如

float secs = 0.8312f;

您可以将 windows 版本替换为:

float secs = 0.8312f;
DWORD delay = static_cast<DWORD>(fabs(secs * 1000.0f));
Sleep(delay);

也许您可以对此添加一些检查(例如 secs 是否为负...)。

为了保持主要代码库的可移植性,您可以创建一个额外的模块,在其中定义您自己的可移植睡眠函数,可能带有签名 void PortableSleep(float seconds);。然后,将 Unix 实现放在一个 .cpp 文件中,将 win32 实现放在另一个 .cpp 文件中,并相应地 link。

如果您想浪费时间弄清楚 <chrono> 的工作原理,您还可以使用 std::this_thread::sleep_for()(VS 缺少一项功能,这使得它更难使用) .