winapi – 适用于Windows XP的线程安全的GetTickCount64实现
发布时间:2020-12-13 22:27:04 所属栏目:Windows 来源:网络整理
导读:我的目标是 Windows XP,我需要一个类似于GetTickCount64的函数,它不会溢出. 我找不到一个正确且线程安全的正确解决方案,所以我试图推出自己的解决方案. 这是我想出的: ULONGLONG MyGetTickCount64(void){ static volatile DWORD dwHigh = 0; static volatil
我的目标是
Windows XP,我需要一个类似于GetTickCount64的函数,它不会溢出.
我找不到一个正确且线程安全的正确解决方案,所以我试图推出自己的解决方案. 这是我想出的: ULONGLONG MyGetTickCount64(void) { static volatile DWORD dwHigh = 0; static volatile DWORD dwLastLow = 0; DWORD dwTickCount; dwTickCount = GetTickCount(); if(dwTickCount < (DWORD)InterlockedExchange(&dwLastLow,dwTickCount)) { InterlockedIncrement(&dwHigh); } return (ULONGLONG)dwTickCount | (ULONGLONG)dwHigh << 32; } 它真的是线程安全吗? 线程安全很难检查是否正确,所以我不确定它是否真的在所有情况下都是正确的. 解决方法
在Windows上,计时器溢出问题通常使用QueryPerformanceCounter()函数而不是GetTickCount()解决(在游戏中):
double GetCycles() const { LARGE_INTEGER T1; QueryPerformanceCounter( &T1 ); return static_cast<double>( T1.QuadPart ); } 然后,您可以将此数字乘以每秒的倒数周期数,以将周期转换为秒: void Initialize() { LARGE_INTEGER Freq; QueryPerformanceFrequency( &Freq ); double CyclesPerSecond = static_cast<double>( Freq.QuadPart ); RecipCyclesPerSecond = 1.0 / CyclesPerSecond; } 初始化后,此代码是线程安全的: double GetSeconds() const { return GetCycles() * RecipCyclesPerSecond; } 您还可以从我们的开源Linderdaum Engine中查看完整的源代码(可在Windows和许多其他平台之间移植):http://www.linderdaum.com (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- windows – 两个DFS复制组类型之间有什么区别?
- windows – 在运行spark-shell之前编辑spark-env.sh的正确方
- Windows – 命令提示符执行相同名称的文件(a.bat vs a.cmd
- hyper-v-server-2012-r2 – Windows 10更新后无法连接Hyper
- 使用’.NETFramework,Version = v4.6.1’恢复了包’Microso
- 推送通知 – 了解Windows Phone 8.1的推送通知
- Windows和Linux上 安装MySQL
- windows – 网络充斥着M-SEARCH数据包:这是什么意思?
- 为什么OpenCV在2.4.7中发布了“World.dll”?
- Windows 8 SDK重命名了所有标题,我不知道现在要包括什么?