2010-06-29 4 views
4

Я хочу установить разрешение таймера машины на 0,5 мс.Как настроить разрешение таймера на 0,5 мс?

Утилита Sysinternal сообщает, что минимальное разрешение часов составляет 0,5 мс, поэтому это можно сделать.

P.S. Я знаю, как установить его на 1 мс.

P.P.S. Я изменил его из C# более общий вопрос (спасибо Hans) Разрешение таймера

Система

+0

Вы можете посмотреть [здесь] (Http: //www.windowstimestamp/description) для получения более подробной информации о настройках таймера и услуг таймера суб миллисекунду. – Arno

ответ

7

NtSetTimerResolution

Пример кода:

#include <windows.h> 

extern "C" NTSYSAPI NTSTATUS NTAPI NtSetTimerResolution(ULONG DesiredResolution, BOOLEAN SetResolution, PULONG CurrentResolution); 

... 

ULONG currentRes; 
NtSetTimerResolution(5000, TRUE, &currentRes); 

Связь с ntdll.lib.

-6

Timer.Interval = 500;

+3

, что составляет 0,5 с .... – SRKX

+1

Это половина секунды. OP запрашивает менее 1 мс. – bentsai

1

Вам необходимо высокое разрешение таймера для него .. Вы можете найти информацию здесь: http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx

EDIT: Более подробную информацию можно найти здесь: установить на десятую миллисекунды; http://msdn.microsoft.com/en-us/library/aa964692(VS.80).aspx

+6

Выполнено 'System.Diagnostics.Stopwatch' в System.dll. –

+0

@Charlie Salts: Это класс Bobb ищет, я думаю (+1) – riffnl

+1

Я не хочу измерять время, мне просто нужно его тикать быстрее. –

3

Лучшее, что вы можете получить от Win32 API, - это миллисекунда с timeBeginPeriod и timeSetEvent. Возможно, ваш HAL может сделать лучше, но это академический, вы не можете написать код драйвера устройства на C#.

+0

I alredy использование те. Я надеялся получить это. Вы знаете, есть ли утилита, которая может это сделать (не обязательно в C#). Мне просто нужно изменить системные часы в конце концов. –

+0

Я изменил с C# на что-нибудь еще. просто нужно, чтобы это было сделано в любом случае. –

3

Вы, , можете получить разрешение 0,5 мс с помощью скрытого API NtSetTimerResolution(). NtSetTimerResolution экспортируется родной библиотекой NTDLL.DLL для Windows NT. См. How to set timer resolution to 0.5ms ? на MSDN. Тем не менее, истинное достижимое разрешение определяется базовым оборудованием. Современное оборудование поддерживает разрешение 0,5 мс. Более подробная информация находится в Inside Windows NT High Resolution Timers. Поддерживаемые разрешения могут быть получены вызовом NtQueryTimerResolution().

Как сделать:

#define STATUS_SUCCESS 0 
#define STATUS_TIMER_RESOLUTION_NOT_SET 0xC0000245 

// after loading NtSetTimerResolution from ntdll.dll: 

// The requested resolution in 100 ns units: 
ULONG DesiredResolution = 5000; 
// Note: The supported resolutions can be obtained by a call to NtQueryTimerResolution() 

ULONG CurrentResolution = 0; 

// 1. Requesting a higher resolution 
// Note: This call is similar to timeBeginPeriod. 
// However, it to to specify the resolution in 100 ns units. 
if (NtSetTimerResolution(DesiredResolution ,TRUE,&CurrentResolution) != STATUS_SUCCESS) { 
    // The call has failed 
} 

printf("CurrentResolution [100 ns units]: %d\n",CurrentResolution); 
// this will show 5000 on more modern platforms (0.5ms!) 

//  do your stuff here at 0.5 ms timer resolution 

// 2. Releasing the requested resolution 
// Note: This call is similar to timeEndPeriod 
switch (NtSetTimerResolution(DesiredResolution ,FALSE,&CurrentResolution) { 
    case STATUS_SUCCESS: 
     printf("The current resolution has returned to %d [100 ns units]\n",CurrentResolution); 
     break; 
    case STATUS_TIMER_RESOLUTION_NOT_SET: 
     printf("The requested resolution was not set\n"); 
     // the resolution can only return to a previous value by means of FALSE 
     // when the current resolution was set by this application  
     break; 
    default: 
     // The call has failed 

} 

Примечание: Функциональность NtSetTImerResolution в основном преобразуются в функции timeBeginPeriodиtimeEndPeriod, используя булево значение Set (см Inside Windows NT High Resolution Timers для получения более подробной информации о схеме и все его последствия). Однако мультимедийный пакет ограничивает степень детализации до миллисекунд, а NtSetTimerResolution позволяет установить значения в миллисекундах.

+0

Спасибо. Это то, что я нашел 4 года назад .. но после шквала враждебности и ошибочных ответов я ответил сам, но как можно короче (потому что это никому не нужно). и я с удовольствием использую это в своем программном обеспечении в реальном времени с тех пор (что невозможно писать на windows и .net в соответствии с большинством «разработчиков»). PS Я посмотрел на ваш проект. кажется многообещающим .. просто следите за «дрожанием» таймера окна. Ваш проект намного сложнее, чем мой! удачи! –

+0

Основываясь на моих экспериментах, я думаю, что код ошибки STATUS_TIMER_RESOLUTION_NOT_SET должен быть 0xC0000245 не 245 –

+0

@RolandPihlakas Это правильно, спасибо. Я отредактировал свой ответ, чтобы исправить это. Фактически это [задокументировано в MSDN] (http://msdn.microsoft.com/en-us/library/cc704588.aspx). – Arno

0

Если вы используете python, я написал библиотеку с именем wres, которая внутренне вызывает NtSetTimerResolution.

pip install wres

import wres 

# Set resolution to 0.5 ms (in 100-ns units) 
# Automatically restore previous resolution when exit with statement 
with wres.set_resolution(5000): 
    pass 
+0

Возможно, добавление немного более подробной информации в этот пост было бы намного более полезным для OP и сообщества в целом. –

Смежные вопросы