我想在C++中实现一个简单的计时器机制.该代码应该适用于Windows和Linux.分辨率应尽可能精确(至少精确到毫秒).这将用于简单地跟踪时间的流逝,而不是实现任何类型的事件驱动设计.完成此任务的最佳工具是什么?
我从How to get duration, as int milli's and float seconds from <chrono> 中得到了这段代码?
#include <chrono>
#include <iostream>
int main (int argc, char *argv[])
{
auto t0 = std::chrono::high_resolution_clock::now();
auto t1 = std::chrono::high_resolution_clock::now();
std::chrono::duration< double > fs = t1 - t0;
std::chrono::milliseconds d = std::chrono::duration_cast< std::chrono::milliseconds >( fs );
std::cout << fs.count() << "s\n";
std::cout << d.count() << "ms\n";
}
Run Code Online (Sandbox Code Playgroud)
哪个工作得很好,但是我如何创建时间戳:
hour:minute:second:millisecond:microsecond:nanosecond
Run Code Online (Sandbox Code Playgroud)
使用auto t0 = std::chrono::high_resolution_clock::now()值?
我试图打印这个auto t0 = std::chrono::high_resolution_clock::now();值,看看里面有什么,但它只给了我一个大错误堆栈:
#include <chrono>
#include <iostream> …Run Code Online (Sandbox Code Playgroud) 在http://en.cppreference.com/w/cpp/chrono的示例中,在a中获取秒值double.这是我想要的行为.然而,这似乎依赖于隐含的假设,即时间点减法产生表示秒的值.我找不到任何解释为什么持续时间在没有实际指定时间单位时产生浮点秒的原因.在没有使用的情况auto下,有人可以展示如何在浮点类型中显式获取时间单位,例如秒,或者指向文档或解释为什么上述转换代表秒数?
有问题的转换基本上是:
std::chrono::time_point<std::chrono::system_clock> start = std::chrono::system_clock::now();
std::chrono::time_point<std::chrono::system_clock> end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start; // why does this represent seconds as opposed to some other time unit?
double secondsInDouble = elapsed_seconds.count();
Run Code Online (Sandbox Code Playgroud)
有关转换的示例,请参阅以下帖子.
如何从<chrono>获得int milli和float秒的持续时间?
我研究了几个主题,以期获得有关如何使用C或C ++制作可靠时钟的一些想法。但是,我还看到一些函数使用处理器的滴答声和每秒滴答声来计算最终结果,我认为这对像我这样拥有自动超频功能的CPU可能是个问题。我还看到其中一个在一段时间后重置,因此不是很可靠。
这个想法是要制作一个(最好是跨平台的)时钟,就像游戏中的时钟一样,其精度要优于第二个时钟,以便能够将“当前会话”中的经过时间与最后保存的时间相加该程序。这将是计算在没有游戏内时钟的主机游戏上花费的时间,以及从长远来看可能将其集成到实际PC游戏中的时间。
它应该能够在不占用过多或全部CPU时间(或多核CPU为单核时间)的情况下运行,因为仅将所有这些资源用于时钟以及在具有自动-超频(否则可能会导致结果不准确)。
我现在想在其中实现此功能的程序看起来像这样,但是我可能会用C重新编码(因为我必须回到学习如何用C ++编码的方式):
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "In game" << endl;
system("PAUSE");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我仍然需要摆脱特定于Windows的PAUSE功能,但是我认为可以通过一个简单的“ while(char!='\ n')”循环来解决。
我已经浏览过的内容:
(编辑:额外的研究,特别是对于C实现:
问题在于尚不清楚上述提到的某些方法(例如Boost或SDL2)在自动超频方面是否表现正常。
TL; DR:我应该使用什么跨平台功能在C / C ++中创建一个精确的,亚秒级的精确计数器,该计数器可以在多核和/或自动超频处理器上工作?
提前致谢。