.NET QueryPerformanceCounter, печатающий дневное время - PullRequest
2 голосов
/ 22 декабря 2009

Мне нужно отформатировать дневное время с помощью QueryPerformanceCounter Win32 API. Формат: ЧЧ: мм: сс.фффффф, содержащий часы, минуты, секунды и микросекунды. Мне нужно использовать ЭТУ функцию, потому что другой процесс (написанный на C) использует эту функцию, и целью является использование одной и той же функции в обоих местах.

Спасибо

Ответы [ 4 ]

5 голосов
/ 22 декабря 2009

Класс System.Diagnostics.Stopwatch использует QueryPerformanceCounter (), избавляет вас от необходимости P / Invoke его.

2 голосов
/ 22 декабря 2009

Не следует использовать QueryPerformanceCounter для определения времени суток. Он может использоваться только для определения истекшего интервала с очень высоким разрешением, поскольку он возвращает количество тактов, прошедших с момента последней перезагрузки компьютера.

Таким образом, в лучшем случае вы можете только определить, сколько часов, минут и секунд прошло с момента предыдущего чтения QueryPerformanceCounter, которое не должно было произойти слишком долго в прошлом.

Чтобы преобразовать тики в секунды, вам нужно определить частоту (используя QueryPerformanceFrequency ) тиков на компьютере, на котором вы используете функцию QueryPerformanceCounter, а затем разделить показания на эту частоту :

// 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

Альтернативой приведенному выше примеру будет использование структуры TimeSpan , доступной в .Net, в которой есть конструктор, который принимает тики примерно так:

// 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());
0 голосов
/ 24 сентября 2012

Возможно, я неправильно понял вопрос, поскольку для меня ни один из предыдущих ответов не имеет никакого отношения вообще.

У меня возникла проблема (которая отправила меня сюда): Учитывая значение из QueryPerformanceCounter,поскольку что-то вне моего контроля определяет временные метки с помощью этой функции, как я могу преобразовать эти значения в обычную дату / время?

Я полагал, что QueryPerformanceCounter возвращает количество секунд с момента загрузки системыумножается (и увеличивается в разрешении) в зависимости от QueryPerformanceFrequency.Таким образом, самое простое решение - получить текущую дату / время, вычесть количество секунд, возвращаемое QueryPerformanceCounter/QueryPerformanceFrequency, а затем добавить значения, которые вы хотите отформатировать как время дня.

0 голосов
/ 21 января 2010

Можно использовать: 1) Класс System.Diagnostics.Stopwatch использует QueryPerformanceCounter (), избавляет вас от необходимости выполнять P / Invoke. 2) Можно использовать напрямую, импортируя из Win32 dll. [DLLImport (Win32)] и имя функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...