问题描述
我使用以下命令成功将计时分辨率更改为0.5ms:
#include <Windows.h>
extern "C" NTSYSAPI NTSTATUS NTAPI NtSetTimerResolution(ULONG DesiredResolution,BOOLEAN SetResolution,PULONG CurrentResolution);
extern "C" NTSYSAPI NTSTATUS NTAPI NtQueryTimerResolution(OUT PULONG MinimumResolution,OUT PULONG MaximumResolution,OUT PULONG CurrentResolution);
ULONG minimum_resolution;
ULONG maximum_resolution;
ULONG current_resolution;
NtQueryTimerResolution(&minimum_resolution,&maximum_resolution,¤t_resolution);
NtSetTimerResolution(maximum_resolution,TRUE,¤t_resolution);
但是,我无法将其恢复为原始值156250。
我的尝试:
NtQueryTimerResolution(&minimum_resolution,¤t_resolution);
std::cout << "minimum = " << minimum_resolution << "\nmaximum = " << maximum_resolution << "\ncurrent = " << current_resolution << "\n";
auto result = NtSetTimerResolution(minimum_resolution,FALSE,¤t_resolution);
std::cout << "after setting using FALSE,current = " << current_resolution << "\n";
NtQueryTimerResolution(&minimum_resolution,¤t_resolution);
std::cout << "Now,minimum = " << minimum_resolution << "\nmaximum = " << maximum_resolution << "\ncurrent = " << default_resolution << "\n";
result = NtSetTimerResolution(minimum_resolution,¤t_resolution);
std::cout << "after setting using TRUE,current = " << current_resolution << "\n";
产生以下输出:
minimum = 156250
maximum = 5000
current = 4999
after setting using FALSE,current = 9999
Now,minimum = 156250
maximum = 5000
current = 9999
after setting using TRUE,current = 9999
奇怪的是,9999的值并不持久;连续调用会产生相同的输出(无需使用第一段代码设置计时器);即使重新启动也无法还原任何内容。我已确保Visual Studio和浏览器已关闭。使用timeBeginPeriod和timeEndPeriod也无济于事。
解决方法
在 NtQueryTimerResolution
之后再次调用 NtSetTimerResolution
,然后打印日志。
另外,最好检查一下函数的结果。