Win32 API 日本語リファレンス
ホーム › System.WindowsProgramming › QueryInterruptTimePrecise

QueryInterruptTimePrecise

関数
高精度の割り込み時間カウンタ値を取得する。
DLLapi-ms-win-core-realtime-l1-1-1.dll呼出規約winapi対応OSWindows 10 以降

シグネチャ

// api-ms-win-core-realtime-l1-1-1.dll
#include <windows.h>

void QueryInterruptTimePrecise(
    ULONGLONG* lpInterruptTimePrecise
);

パラメーター

名前型方向説明
lpInterruptTimePreciseULONGLONG*out割り込み時間カウントを 100 ナノ秒のシステム時間単位で受け取る ULONGLONG へのポインター。秒単位にするには 1000 万 (1e7) で除算します (1 秒は 1e9 ナノ秒なので、1 秒は 1e7 個の 100 ナノ秒に相当します)。

戻り値の型: void

公式ドキュメント

QueryInterruptTime よりも高い精度で、現在の割り込み時間 (interrupt-time) カウントを取得します。

解説(Remarks)

QueryInterruptTimePrecise は QueryInterruptTime ルーチンと似ていますが、より高精度です。QueryInterruptTime が報告する割り込み時間は、システム クロック タイマーの最新のティックに基づいています。システム クロック タイマーは、システム クロック用の割り込みを定期的に生成するハードウェア タイマーです。システム クロック タイマー割り込みの一定の周期はシステム クロック ティックと呼ばれ、ハードウェア プラットフォームに応じて通常は 0.5 ミリ秒から 15.625 ミリ秒の範囲になります。QueryInterruptTime が取得する割り込み時間の値は、システム クロック ティックの範囲内の精度で正確です。

QueryInterruptTime よりも高精度なシステム時間の値を提供するため、QueryInterruptTimePrecise はタイマー ハードウェアを直接読み取ります。そのため、QueryInterruptTimePrecise の呼び出しは QueryInterruptTime の呼び出しよりも低速になることがあります。

システム クロック ティックの長さを調べるには、KeQueryTimeIncrement ルーチンを呼び出します。

QueryInterruptTime の「解説」も参照してください。

注意 QueryInterruptTimePrecise 関数は、Windows のデバッグ ("チェック済み") ビルドでは異なる結果を返します。これは、割り込み時間カウントとティック カウントが約 49 日分進められるためです。これにより、システムを長時間実行しないと発生しないバグを特定しやすくなります。
この関数を使用するアプリケーションをコンパイルするには、_WIN32_WINNT を 0x0601 以降として定義します。詳細については、 Windows ヘッダーの使用を参照してください。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// api-ms-win-core-realtime-l1-1-1.dll
#include <windows.h>

void QueryInterruptTimePrecise(
    ULONGLONG* lpInterruptTimePrecise
);
[DllImport("api-ms-win-core-realtime-l1-1-1.dll", ExactSpelling = true)]
static extern void QueryInterruptTimePrecise(
    out ulong lpInterruptTimePrecise   // ULONGLONG* out
);
<DllImport("api-ms-win-core-realtime-l1-1-1.dll", ExactSpelling:=True)>
Public Shared Sub QueryInterruptTimePrecise(
    <Out> ByRef lpInterruptTimePrecise As ULong   ' ULONGLONG* out
)
End Sub
' lpInterruptTimePrecise : ULONGLONG* out
Declare PtrSafe Sub QueryInterruptTimePrecise Lib "api-ms-win-core-realtime-l1-1-1" ( _
    ByRef lpInterruptTimePrecise As LongLong)
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

QueryInterruptTimePrecise = ctypes.windll.LoadLibrary("api-ms-win-core-realtime-l1-1-1.dll").QueryInterruptTimePrecise
QueryInterruptTimePrecise.restype = None
QueryInterruptTimePrecise.argtypes = [
    ctypes.POINTER(ctypes.c_ulonglong),  # lpInterruptTimePrecise : ULONGLONG* out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('api-ms-win-core-realtime-l1-1-1.dll')
QueryInterruptTimePrecise = Fiddle::Function.new(
  lib['QueryInterruptTimePrecise'],
  [
    Fiddle::TYPE_VOIDP,  # lpInterruptTimePrecise : ULONGLONG* out
  ],
  Fiddle::TYPE_VOID)
#[link(name = "api-ms-win-core-realtime-l1-1-1")]
extern "system" {
    fn QueryInterruptTimePrecise(
        lpInterruptTimePrecise: *mut u64  // ULONGLONG* out
    );
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("api-ms-win-core-realtime-l1-1-1.dll")]
public static extern void QueryInterruptTimePrecise(out ulong lpInterruptTimePrecise);
"@
$api = Add-Type -MemberDefinition $sig -Name 'api-ms-win-core-realtime-l1-1-1_QueryInterruptTimePrecise' -Namespace Win32 -PassThru
# $api::QueryInterruptTimePrecise(lpInterruptTimePrecise)
#uselib "api-ms-win-core-realtime-l1-1-1.dll"
#func global QueryInterruptTimePrecise "QueryInterruptTimePrecise" sptr
; QueryInterruptTimePrecise varptr(lpInterruptTimePrecise)
; lpInterruptTimePrecise : ULONGLONG* out -> "sptr"
出力引数:
#uselib "api-ms-win-core-realtime-l1-1-1.dll"
#func global QueryInterruptTimePrecise "QueryInterruptTimePrecise" var
; QueryInterruptTimePrecise lpInterruptTimePrecise
; lpInterruptTimePrecise : ULONGLONG* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; void QueryInterruptTimePrecise(ULONGLONG* lpInterruptTimePrecise)
#uselib "api-ms-win-core-realtime-l1-1-1.dll"
#func global QueryInterruptTimePrecise "QueryInterruptTimePrecise" var
; QueryInterruptTimePrecise lpInterruptTimePrecise
; lpInterruptTimePrecise : ULONGLONG* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	api_ms_win_core_realtime_l1_1_1 = windows.NewLazySystemDLL("api-ms-win-core-realtime-l1-1-1.dll")
	procQueryInterruptTimePrecise = api_ms_win_core_realtime_l1_1_1.NewProc("QueryInterruptTimePrecise")
)

// lpInterruptTimePrecise (ULONGLONG* out)
r1, _, err := procQueryInterruptTimePrecise.Call(
	uintptr(lpInterruptTimePrecise),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // void
procedure QueryInterruptTimePrecise(
  lpInterruptTimePrecise: Pointer   // ULONGLONG* out
); stdcall;
  external 'api-ms-win-core-realtime-l1-1-1.dll' name 'QueryInterruptTimePrecise';
result := DllCall("api-ms-win-core-realtime-l1-1-1\QueryInterruptTimePrecise"
    , "Ptr", lpInterruptTimePrecise   ; ULONGLONG* out
    , "Int")   ; return: void
●QueryInterruptTimePrecise(lpInterruptTimePrecise) = DLL("api-ms-win-core-realtime-l1-1-1.dll", "int QueryInterruptTimePrecise(void*)")
# 呼び出し: QueryInterruptTimePrecise(lpInterruptTimePrecise)
# lpInterruptTimePrecise : ULONGLONG* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "api-ms-win-core-realtime-l1-1-1" fn QueryInterruptTimePrecise(
    lpInterruptTimePrecise: [*c]u64 // ULONGLONG* out
) callconv(std.os.windows.WINAPI) void;
proc QueryInterruptTimePrecise(
    lpInterruptTimePrecise: ptr uint64  # ULONGLONG* out
) {.importc: "QueryInterruptTimePrecise", stdcall, dynlib: "api-ms-win-core-realtime-l1-1-1.dll".}
pragma(lib, "api-ms-win-core-realtime-l1-1-1");
extern(Windows)
void QueryInterruptTimePrecise(
    ulong* lpInterruptTimePrecise   // ULONGLONG* out
);
ccall((:QueryInterruptTimePrecise, "api-ms-win-core-realtime-l1-1-1.dll"), stdcall, Cvoid,
      (Ptr{UInt64},),
      lpInterruptTimePrecise)
# lpInterruptTimePrecise : ULONGLONG* out -> Ptr{UInt64}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void QueryInterruptTimePrecise(
    uint64_t* lpInterruptTimePrecise);
]]
local api-ms-win-core-realtime-l1-1-1 = ffi.load("api-ms-win-core-realtime-l1-1-1")
-- api-ms-win-core-realtime-l1-1-1.QueryInterruptTimePrecise(lpInterruptTimePrecise)
-- lpInterruptTimePrecise : ULONGLONG* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('api-ms-win-core-realtime-l1-1-1.dll');
const QueryInterruptTimePrecise = lib.func('__stdcall', 'QueryInterruptTimePrecise', 'void', ['uint64_t *']);
// QueryInterruptTimePrecise(lpInterruptTimePrecise)
// lpInterruptTimePrecise : ULONGLONG* out -> 'uint64_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("api-ms-win-core-realtime-l1-1-1.dll", {
  QueryInterruptTimePrecise: { parameters: ["pointer"], result: "void" },
});
// lib.symbols.QueryInterruptTimePrecise(lpInterruptTimePrecise)
// lpInterruptTimePrecise : ULONGLONG* out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void QueryInterruptTimePrecise(
    uint64_t* lpInterruptTimePrecise);
C, "api-ms-win-core-realtime-l1-1-1.dll");
// $ffi->QueryInterruptTimePrecise(lpInterruptTimePrecise);
// lpInterruptTimePrecise : ULONGLONG* out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Api-ms-win-core-realtime-l1-1-1 extends StdCallLibrary {
    Api-ms-win-core-realtime-l1-1-1 INSTANCE = Native.load("api-ms-win-core-realtime-l1-1-1", Api-ms-win-core-realtime-l1-1-1.class);
    void QueryInterruptTimePrecise(
        LongByReference lpInterruptTimePrecise   // ULONGLONG* out
    );
}
@[Link("api-ms-win-core-realtime-l1-1-1")]
lib Libapi-ms-win-core-realtime-l1-1-1
  fun QueryInterruptTimePrecise = QueryInterruptTimePrecise(
    lpInterruptTimePrecise : UInt64*   # ULONGLONG* out
  ) : Void
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef QueryInterruptTimePreciseNative = Void Function(Pointer<Uint64>);
typedef QueryInterruptTimePreciseDart = void Function(Pointer<Uint64>);
final QueryInterruptTimePrecise = DynamicLibrary.open('api-ms-win-core-realtime-l1-1-1.dll')
    .lookupFunction<QueryInterruptTimePreciseNative, QueryInterruptTimePreciseDart>('QueryInterruptTimePrecise');
// lpInterruptTimePrecise : ULONGLONG* out -> Pointer<Uint64>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
procedure QueryInterruptTimePrecise(
  lpInterruptTimePrecise: Pointer   // ULONGLONG* out
); stdcall;
  external 'api-ms-win-core-realtime-l1-1-1.dll' name 'QueryInterruptTimePrecise';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "QueryInterruptTimePrecise"
  c_QueryInterruptTimePrecise :: Ptr Word64 -> IO ()
-- lpInterruptTimePrecise : ULONGLONG* out -> Ptr Word64
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let queryinterrupttimeprecise =
  foreign "QueryInterruptTimePrecise"
    ((ptr uint64_t) @-> returning void)
(* lpInterruptTimePrecise : ULONGLONG* out -> (ptr uint64_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library api-ms-win-core-realtime-l1-1-1 (t "api-ms-win-core-realtime-l1-1-1.dll"))
(cffi:use-foreign-library api-ms-win-core-realtime-l1-1-1)

(cffi:defcfun ("QueryInterruptTimePrecise" query-interrupt-time-precise :convention :stdcall) :void
  (lp-interrupt-time-precise :pointer))   ; ULONGLONG* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $QueryInterruptTimePrecise = Win32::API::More->new('api-ms-win-core-realtime-l1-1-1',
    'void QueryInterruptTimePrecise(LPVOID lpInterruptTimePrecise)');
# my $ret = $QueryInterruptTimePrecise->Call($lpInterruptTimePrecise);
# lpInterruptTimePrecise : ULONGLONG* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目