ホームページ  >  記事  >  バックエンド開発  >  POSIX 環境からコードを移植する場合、Windows システム上で ` Clock_gettime ` の機能を複製するにはどうすればよいですか?

POSIX 環境からコードを移植する場合、Windows システム上で ` Clock_gettime ` の機能を複製するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 07:21:03351ブラウズ

How can I replicate the functionality of `clock_gettime` on Windows systems when porting code from POSIX environments?

Windows への Clock_gettime の移植

Clock_gettime 関数は、現在時刻を返す POSIX 関数です。 Windows では利用できないため、POSIX システムから Windows にコードを移植する場合は、代替関数が必要です。

Windows での Clock_gettime の代替関数として考えられるものの 1 つは、GetSystemTimeAsFileTime 関数です。この関数は、現在の時刻を FILETIME 構造体として返します。 FILETIME 構造体は、1601 年 1 月 1 日からの 100 ナノ秒間隔の数を表す 64 ビットの整数です。

GetSystemTimeAsFileTime 関数を使用して Clock_gettime を置き換えるには、次のコードを使用できます。

<code class="c++">#include <windows.h>

int clock_gettime(int X, struct timeval *tv)
{
    FILETIME ft;
    GetSystemTimeAsFileTime(&ft);
    tv->tv_sec = ft.dwHighDateTime;
    tv->tv_usec = ft.dwLowDateTime / 10;
    return 0;
}</code>

このコードは、tv 構造体の現在時刻を返します。 tv_sec フィールドには 1970 年 1 月 1 日からの秒数が含まれ、tv_usec フィールドには最後の 1 秒からのマイクロ秒数が含まれます。

Windows 上で Clock_gettime に代わる可能性のあるもう 1 つの関数は、QueryPerformanceCounter 関数です。この関数は、現在時刻を LARGE_INTEGER 構造体として返します。 LARGE_INTEGER 構造体は、コンピューターの起動以降の 100 ナノ秒間隔の数を表す 64 ビットの整数です。

QueryPerformanceCounter 関数を使用して Clock_gettime を置き換えるには、次のコードを使用できます。

<code class="c++">#include <windows.h>

int clock_gettime(int X, struct timeval *tv)
{
    LARGE_INTEGER ft;
    QueryPerformanceCounter(&ft);
    tv->tv_sec = ft.QuadPart / 10000000;
    tv->tv_usec = ft.QuadPart % 10000000 / 10;
    return 0;
}</code>

このコードは、tv 構造体の現在時刻を返します。 tv_sec フィールドにはコンピュータが起動してからの秒数が含まれ、tv_usec フィールドには最後の 1 秒からのマイクロ秒数が含まれます。

以上がPOSIX 環境からコードを移植する場合、Windows システム上で ` Clock_gettime ` の機能を複製するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。