私は、Windows、Mac、Android、IOSなどのクロスプラットフォームで使用されるようになっているc ++でフレームワークdllを作成しました。1つのAPIget_time_since_boot_milli_seconds()を実装する必要があります。これにより、システムクロスプラットフォーム(windows / mac / IOS / Android)の起動からミリ秒単位で時間が与えられます。
GetTickCount64()のような関数を見つけましたが、Windowsでのみ機能します。同様に、Macでのみ機能する機能があります。std :: chronoを試しましたが、関連するAPIを取得できませんでした。
すべてのプラットフォームで起動してからミリ秒単位で時間を与えることができる標準のstdC ++関数を期待しています。
stdタイマーのどれも保証された稼働時間を提供しないと思います。そうです、あなたはそれを自分でしなければならないでしょう。
ウィンドウズ:
#if (_WIN32_WINNT >= 0x0600)
uint64_t uptime_milli = GetTickCount64();
#else
uint32_t uptime_milli = GetTickCount();
#endif
上記の解決策には、スリープ/サスペンドおよび休止時間が含まれている必要があります。サポートされているOSバージョンの範囲によっては、コンパイル時#if
をGetTickCount64
「kernel32.dll」で使用できるかどうかのランタイムテストに置き換えることができます。
別の解決策はを使用することQueryUnbiasedInterruptTime()
です。スリープ/サスペンド/休止時間は含まれませんが、より信頼性が高くなります(ユーザーが不正行為や干渉を行うことができないという意味で)。
新しいPosixベースのプラットフォーム:
struct timespec up;
int err = clock_gettime(CLOCK_BOOTTIME, &up);
if (err != 0)
HandleError();
uint64_t uptime_nano = up.tv_sec * 1000000000 + up.tv_nsec;
この関数によって返される間隔には、スリープ時間と一時停止時間が含まれている必要があります。
古いLinux(glibc 2.3.6前後、確認できません):
struct timespec up;
int err = clock_gettime(CLOCK_MONOTONIC, &up);
if (err != 0)
HandleError();
uint64_t uptime_nano = up.tv_sec * 1000000000 + up.tv_nsec;
このメソッドによって返される時間には、スリープ/サスペンド状態は含まれません。
OS X、古いFreeBSD、Linux、Android:
struct timeval boot;
int mib[] = { CTL_KERN, KERN_BOOTTIME };
size_t size = sizeof(boot);
int err = sysctl(mib, 2, &boot, &size, 0, 0);
if (err != 0)
HandleError();
struct timeval now;
err = gettimeofday(&now, 0);
if (err != 0)
HandleError();
uint64_t uptime_micro = (now.tv_sec * 1000000 + now.tv_usec) - (boot.tv_sec * 1000000 + boot.tv_usec);
このメソッドは、計算に2回の呼び出しが必要な限り、競合の影響を受けます。
Macもmach_absolute_time()
機能を提供しますが、その動作は予期しないものになる可能性があります。最初の30秒間のスリープをカウントし、その後カウントを停止します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加