C# 定时器最小限制

C# 定时器最小限制,c#,timer,C#,Timer,我需要写一个程序(.NET C#),它正在做一些事情,但每0.5毫秒我需要读取一些数据,看看它是否更改为某个值或高于该值,如果该值已达到该目标,请停止我正在做的所有其他事情。 将计时器设置为每0.5毫秒运行一次是否有问题? 这种程序的正确方法是什么?您可以使用MicroLibrary进行此操作。请看:您可以使用MicroLibrary进行此操作。请看:您可以使用MicroLibrary进行此操作。请看:您可以使用MicroLibrary进行此操作。看看:1毫秒还是0.5毫秒? Hans是对的,多

我需要写一个程序(.NET C#),它正在做一些事情,但每0.5毫秒我需要读取一些数据,看看它是否更改为某个值或高于该值,如果该值已达到该目标,请停止我正在做的所有其他事情。 将计时器设置为每0.5毫秒运行一次是否有问题?
这种程序的正确方法是什么?

您可以使用MicroLibrary进行此操作。请看:

您可以使用MicroLibrary进行此操作。请看:

您可以使用MicroLibrary进行此操作。请看:

您可以使用MicroLibrary进行此操作。看看:

1毫秒还是0.5毫秒? Hans是对的,多媒体定时器接口能够提供低至1ms的分辨率。 有关
timeBeginPeriod
的更多详细信息,请参阅(MSDN),(MSDN),并回答。注意:完成后,不要忘记调用以切换回默认计时器分辨率

如何做:

#define TARGET_RESOLUTION 1         // 1-millisecond target resolution

TIMECAPS tc;
UINT     wTimerRes;

if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) 
{
   // Error; application can't continue.
}

wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
timeBeginPeriod(wTimerRes); 

// do your stuff here at approx. 1 ms timer resolution

timeEndPeriod(wTimerRes); 
#define STATUS_SUCCESS 0
#define STATUS_TIMER_RESOLUTION_NOT_SET 0xC0000245

// after loading NtSetTimerResolution from ntdll.dll:

ULONG RequestedResolution = 5000;
ULONG CurrentResolution = 0;

// 1. Requesting a higher resolution
if (NtSetTimerResolution(RequestedResolution,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
switch (NtSetTimerResolution(RequestedResolution,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

}
注:本程序也适用于其他工艺,获得的分辨率适用于系统范围。任何进程请求的最高分辨率都将处于活动状态,请注意后果

但是,您可以通过隐藏的API
NtSetTimerResolution()
获得0.5 ms的分辨率。
NtSetTimerResolution
由本机Windows NT库NTDLL.DLL导出。请参阅MSDN上的。然而,真正可实现的分辨率由底层硬件决定。现代硬件支持0.5毫秒的分辨率。 更多的细节可以在中找到

如何做:

#define TARGET_RESOLUTION 1         // 1-millisecond target resolution

TIMECAPS tc;
UINT     wTimerRes;

if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) 
{
   // Error; application can't continue.
}

wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
timeBeginPeriod(wTimerRes); 

// do your stuff here at approx. 1 ms timer resolution

timeEndPeriod(wTimerRes); 
#define STATUS_SUCCESS 0
#define STATUS_TIMER_RESOLUTION_NOT_SET 0xC0000245

// after loading NtSetTimerResolution from ntdll.dll:

ULONG RequestedResolution = 5000;
ULONG CurrentResolution = 0;

// 1. Requesting a higher resolution
if (NtSetTimerResolution(RequestedResolution,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
switch (NtSetTimerResolution(RequestedResolution,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
的功能基本上通过使用bool值
Set
映射到函数
timeBeginPeriod
timeEndPeriod
(有关方案及其所有含义的更多详细信息,请参阅)。但是,多媒体套件将粒度限制为毫秒,并且允许设置亚毫秒值。

1毫秒或0.5毫秒? Hans是对的,多媒体定时器接口能够提供低至1ms的分辨率。 有关
timeBeginPeriod
的更多详细信息,请参阅(MSDN),(MSDN),并回答。注意:完成后,不要忘记调用以切换回默认计时器分辨率

如何做:

#define TARGET_RESOLUTION 1         // 1-millisecond target resolution

TIMECAPS tc;
UINT     wTimerRes;

if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) 
{
   // Error; application can't continue.
}

wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
timeBeginPeriod(wTimerRes); 

// do your stuff here at approx. 1 ms timer resolution

timeEndPeriod(wTimerRes); 
#define STATUS_SUCCESS 0
#define STATUS_TIMER_RESOLUTION_NOT_SET 0xC0000245

// after loading NtSetTimerResolution from ntdll.dll:

ULONG RequestedResolution = 5000;
ULONG CurrentResolution = 0;

// 1. Requesting a higher resolution
if (NtSetTimerResolution(RequestedResolution,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
switch (NtSetTimerResolution(RequestedResolution,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

}
注:本程序也适用于其他工艺,获得的分辨率适用于系统范围。任何进程请求的最高分辨率都将处于活动状态,请注意后果

但是,您可以通过隐藏的API
NtSetTimerResolution()
获得0.5 ms的分辨率。
NtSetTimerResolution
由本机Windows NT库NTDLL.DLL导出。请参阅MSDN上的。然而,真正可实现的分辨率由底层硬件决定。现代硬件支持0.5毫秒的分辨率。 更多的细节可以在中找到

如何做:

#define TARGET_RESOLUTION 1         // 1-millisecond target resolution

TIMECAPS tc;
UINT     wTimerRes;

if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) 
{
   // Error; application can't continue.
}

wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
timeBeginPeriod(wTimerRes); 

// do your stuff here at approx. 1 ms timer resolution

timeEndPeriod(wTimerRes); 
#define STATUS_SUCCESS 0
#define STATUS_TIMER_RESOLUTION_NOT_SET 0xC0000245

// after loading NtSetTimerResolution from ntdll.dll:

ULONG RequestedResolution = 5000;
ULONG CurrentResolution = 0;

// 1. Requesting a higher resolution
if (NtSetTimerResolution(RequestedResolution,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
switch (NtSetTimerResolution(RequestedResolution,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
的功能基本上通过使用bool值
Set
映射到函数
timeBeginPeriod
timeEndPeriod
(有关方案及其所有含义的更多详细信息,请参阅)。但是,多媒体套件将粒度限制为毫秒,并且允许设置亚毫秒值。

1毫秒或0.5毫秒? Hans是对的,多媒体定时器接口能够提供低至1ms的分辨率。 有关
timeBeginPeriod
的更多详细信息,请参阅(MSDN),(MSDN),并回答。注意:完成后,不要忘记调用以切换回默认计时器分辨率

如何做:

#define TARGET_RESOLUTION 1         // 1-millisecond target resolution

TIMECAPS tc;
UINT     wTimerRes;

if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) 
{
   // Error; application can't continue.
}

wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
timeBeginPeriod(wTimerRes); 

// do your stuff here at approx. 1 ms timer resolution

timeEndPeriod(wTimerRes); 
#define STATUS_SUCCESS 0
#define STATUS_TIMER_RESOLUTION_NOT_SET 0xC0000245

// after loading NtSetTimerResolution from ntdll.dll:

ULONG RequestedResolution = 5000;
ULONG CurrentResolution = 0;

// 1. Requesting a higher resolution
if (NtSetTimerResolution(RequestedResolution,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
switch (NtSetTimerResolution(RequestedResolution,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

}
注:本程序也适用于其他工艺,获得的分辨率适用于系统范围。任何进程请求的最高分辨率都将处于活动状态,请注意后果

但是,您可以通过隐藏的API
NtSetTimerResolution()
获得0.5 ms的分辨率。
NtSetTimerResolution
由本机Windows NT库NTDLL.DLL导出。请参阅MSDN上的。然而,真正可实现的分辨率由底层硬件决定。现代硬件支持0.5毫秒的分辨率。 更多的细节可以在中找到

如何做:

#define TARGET_RESOLUTION 1         // 1-millisecond target resolution

TIMECAPS tc;
UINT     wTimerRes;

if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) 
{
   // Error; application can't continue.
}

wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
timeBeginPeriod(wTimerRes); 

// do your stuff here at approx. 1 ms timer resolution

timeEndPeriod(wTimerRes); 
#define STATUS_SUCCESS 0
#define STATUS_TIMER_RESOLUTION_NOT_SET 0xC0000245

// after loading NtSetTimerResolution from ntdll.dll:

ULONG RequestedResolution = 5000;
ULONG CurrentResolution = 0;

// 1. Requesting a higher resolution
if (NtSetTimerResolution(RequestedResolution,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
switch (NtSetTimerResolution(RequestedResolution,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
的功能基本上通过使用bool值
Set
映射到函数
timeBeginPeriod
timeEndPeriod
(有关方案及其所有含义的更多详细信息,请参阅)。但是,多媒体套件将粒度限制为毫秒,并且允许设置亚毫秒值。

1毫秒或0.5毫秒? Hans是对的,多媒体定时器接口能够提供低至1ms的分辨率。 有关
timeBeginPeriod
的更多详细信息,请参阅(MSDN),(MSDN),并回答。注意:完成后,不要忘记调用以切换回默认计时器分辨率

如何做:

#define TARGET_RESOLUTION 1         // 1-millisecond target resolution

TIMECAPS tc;
UINT     wTimerRes;

if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) 
{
   // Error; application can't continue.
}

wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
timeBeginPeriod(wTimerRes); 

// do your stuff here at approx. 1 ms timer resolution

timeEndPeriod(wTimerRes); 
#define STATUS_SUCCESS 0
#define STATUS_TIMER_RESOLUTION_NOT_SET 0xC0000245

// after loading NtSetTimerResolution from ntdll.dll:

ULONG RequestedResolution = 5000;
ULONG CurrentResolution = 0;

// 1. Requesting a higher resolution
if (NtSetTimerResolution(RequestedResolution,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
switch (NtSetTimerResolution(RequestedResolution,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

}
注:本程序也适用于其他工艺,获得的分辨率适用于系统范围。任何进程请求的最高分辨率都将处于活动状态,请注意后果

但是,您可以通过隐藏的API
NtSetTimerResolution()
获得0.5 ms的分辨率。
NtSetTimerResolution
由本机Windows NT库NTDLL.DLL导出。请参阅MSDN上的。然而,真正可实现的分辨率由底层硬件决定。现代硬件支持0.5毫秒的分辨率。 更多的细节可以在中找到

如何做:

#define TARGET_RESOLUTION 1         // 1-millisecond target resolution

TIMECAPS tc;
UINT     wTimerRes;

if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) 
{
   // Error; application can't continue.
}

wTimerRes = min(max(tc.wPeriodMin, TARGET_RESOLUTION), tc.wPeriodMax);
timeBeginPeriod(wTimerRes); 

// do your stuff here at approx. 1 ms timer resolution

timeEndPeriod(wTimerRes); 
#define STATUS_SUCCESS 0
#define STATUS_TIMER_RESOLUTION_NOT_SET 0xC0000245

// after loading NtSetTimerResolution from ntdll.dll:

ULONG RequestedResolution = 5000;
ULONG CurrentResolution = 0;

// 1. Requesting a higher resolution
if (NtSetTimerResolution(RequestedResolution,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
switch (NtSetTimerResolution(RequestedResolution,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