我需要使用QueryPerformanceCounter Win32 API格式化日期时间。 格式为:HH:mm:ss.ffffff,包含小时小时秒和微秒。 我需要使用THIS函数,因为另一个进程(用C编写)正在使用这个函数,目的是在两个地方使用相同的函数。
由于
答案 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
返回的秒数,然后将您喜欢的值添加到时间格式。