クロスプラットフォームのC ++でシステムを起動/起動時間をミリ秒単位で取得する方法(Windows / IOS / Android / MACで動作するはずです)

ブルンガ

私は、Windows、Mac、Android、IOSなどのクロスプラットフォームで使用されるようになっているc ++でフレームワークdllを作成しました。1つのAPIget_time_since_boot_milli_seconds()を実装する必要があります。これにより、システムクロスプラットフォーム(windows / mac / IOS / Android)の起動からミリ秒単位で時間が与えられます。

GetTickCount64()のような関数を見つけましたが、Windowsでのみ機能します。同様に、Macでのみ機能する機能があります。std :: chronoを試しましたが、関連するAPIを取得できませんでした。

すべてのプラットフォームで起動してからミリ秒単位で時間を与えることができる標準のstdC ++関数を期待しています。

イゴールG

stdタイマーのどれも保証された稼働時間を提供しないと思います。そうです、あなたはそれを自分でしなければならないでしょう。

ウィンドウズ:

#if (_WIN32_WINNT >= 0x0600)
uint64_t    uptime_milli = GetTickCount64();
#else
uint32_t    uptime_milli = GetTickCount();
#endif

上記の解決策には、スリープ/サスペンドおよび休止時間が含まれている必要があります。サポートされているOSバージョンの範囲によっては、コンパイル時#ifGetTickCount64「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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ