.NET QueryPerformanceCounter打印白天的时间

时间:2009-12-22 14:33:18

标签: c# time

我需要使用QueryPerformanceCounter Win32 API格式化日期时间。 格式为:HH:mm:ss.ffffff,包含小时小时秒和微秒。 我需要使用THIS函数,因为另一个进程(用C编写)正在使用这个函数,目的是在两个地方使用相同的函数。

由于

4 个答案:

答案 0 :(得分:5)

System.Diagnostics.Stopwatch类使用QueryPerformanceCounter(),使您不必进行P / Invoke它。

答案 1 :(得分:2)

您不应使用QueryPerformanceCounter来确定一天中的时间。它只能用于确定具有非常高分辨率的已用间隔,因为它返回自计算机上次重新启动以来经过的刻度数。

因此,充其量,您可能只会确定自上次读取QueryPerformanceCounter以来已过去的小时数,分钟数和秒数,这些时间过去太长

要从刻度转换为秒,您需要确定运行QueryPerformanceCounter函数的计算机上的刻度的频率(使用QueryPerformanceFrequency),然后将读数除以该频率:

// obtain frequency
long freq;
QueryPerformanceFrequency(freq);

// then obtain your first reading
long start_count;
long end_count;
QueryPerformanceCounter(start_count)

// .. do some work

// obatin your second reading
QueryPerformanceCounter(end_count);

// calculate time elapsed
long milliseconds_elapsed = (long)(((double)(end_count - start_count) / freq) * 1000);

// from here on you can format milliseconds_elapsed any way you need to

上述示例的替代方法是使用.Net中可用的TimeSpan结构,该结构具有带有如下标记的构造函数:

// then obtain your first reading
long start_count;
long end_count;
QueryPerformanceCounter(start_count)

// .. do some work

// obatin your second reading
QueryPerformanceCounter(end_count);

TimeSpan time_elapsed = new TimeSpan(end_count - start_count);

Console.WriteLine("Time Elapsed: " + time_elapsed.ToString());

答案 2 :(得分:0)

可以使用: 1)System.Diagnostics.Stopwatch类使用QueryPerformanceCounter(),使您不必进行P / Invoke它。 2)可以直接从Win32 dll导入使用。 [DLLImport(Win32)]和函数名称

答案 3 :(得分:0)

可能我误解了这个问题,对我来说,以前的答案都没有任何相关性。

我有问题(发送给我):给定来自QueryPerformanceCounter的值,因为我控制之外的东西使用该函数指定时间戳,如何将这些值转换为正常日期/时间?

我认为QueryPerformanceCounter返回自系统启动以来的秒数,乘以(并在分辨率上扩展)取决于QueryPerformanceFrequency。 因此,最简单的解决方案是获取当前日期/时间,减去QueryPerformanceCounter/QueryPerformanceFrequency返回的秒数,然后将您喜欢的值添加到时间格式。