gettickcount溢出处理
时间: 2023-07-28 12:02:17 浏览: 263
GetTickCount是一个用来计算自系统启动以来经过的毫秒数的函数。根据系统的运行时间,GetTickCount会在达到最大值时重新从0开始计数,这会导致计时器溢出。
为了正确处理GetTickCount的溢出,可以使用以下方法:
1. 利用DWORD变量保存上一次的TickCount值。在每次调用GetTickCount之后,将返回的值与上一次保存的值进行比较。如果返回值比上一次保存的值小,说明发生了溢出,可以通过将返回值加上UINT_MAX来得到正确的时间。如果返回值比上一次保存的值大或相等,说明时间还未溢出,可以直接使用返回值作为经过的毫秒数。
2. 使用GetTickCount64函数代替GetTickCount函数。GetTickCount64是Windows Vista及更高版本提供的函数,它返回从系统启动到当前时间经过的毫秒数,并且将计时器的值保存为64位无符号整数。由于64位整数的范围更大,所以无需担心溢出问题。
以上是处理GetTickCount溢出的两种常用方法。根据特定的需求和系统环境,可以选择适合的方法来处理溢出问题,以确保正确计算经过的时间。
相关问题
在 Microsoft Visual Studio 的 win32控制台程序中使用C语言写一个定时器,设置为1500ms溢出,并封装成函数。
在Microsoft Visual Studio的Win32控制台程序中使用C语言创建一个定时器,通常我们会利用Windows API中的`SetTimer`函数配合`CreateThread`来实现实时任务调度。然而,Windows API并不直接提供1500ms的定时器,所以我们需要通过某种间接的方式来实现这个需求。
首先,你需要包含必要的头文件,如`windows.h`:
```c
#include <windows.h>
```
然后,我们可以定义一个函数,例如`start_timer`,它接受一个回调函数作为参数,该回调函数将在定时器溢出时被调用:
```c
typedef void (WINAPI *TIMER_CALLBACK)(unsigned long id, unsigned long elapsed);
BOOL start_timer(unsigned long interval_ms, TIMER_CALLBACK callback)
{
static const DWORD CALLBACK timer_proc(LPVOID lpParam)
{
if (!lpParam) return TRUE; // 假设callback未传递时结束
unsigned long elapsed = GetTickCount();
callback((unsigned long)-1, elapsed); // 函数参数可能需调整
return SetTimer(NULL, (TIMER_ID)lpParam, interval_ms, timer_proc);
}
HANDLE hTimer = CreateThread(NULL, 0, timer_proc, (LPVOID)&interval_ms, 0, NULL);
if (hTimer == INVALID_HANDLE_VALUE)
{
// 错误处理,如添加日志
return FALSE;
}
else
{
return TRUE;
}
}
```
在这个例子中,我们创建了一个新的线程来持续执行定时任务,`timer_proc`是一个回调函数,每间隔`interval_ms`毫秒就会被调用一次。当`GetTickCount()`返回值超过上次的值时,表示时间已过期。
为了停止定时器,你可以传递一个特定的标识符给`StopTimer`或在`timer_proc`中添加适当的条件检查来关闭定时器:
```c
void stop_timer(unsigned long timer_id)
{
KillTimer(NULL, timer_id);
}
```
在80x86中,基于Windows系统使用汇编语言完成:设x,y为字变量,假定不溢出,计算x=|x-y|,请提供完整代码
在80x86汇编语言中,特别是在Windows环境下,我们可以利用指令集来处理整数运算,包括绝对值操作。但是需要注意的是,由于80x86处理器并没有直接支持绝对值运算指令,我们通常会通过比较操作间接实现。这里是一个简单的例子,假设你有一个环境已经设置了`cx`和`dx`作为临时寄存器用于存储数值:
```assembly
; 导入必要的WinAPI函数
invoke GetTickCount ; 获取当前计时器Tick值到cx
; 假定x在cx,y在dx
; 首先将x减去y
sub cx, dx ; cx = x - y
; 检查是否x > y (正数) 或者 x < 0 (负数)
jc positive_condition ; 如果条件跳转,说明x >= y,不需要绝对值操作
; 否则,如果x <= y,则需要取反绝对值
neg cx ; 对结果取反,因为cx现在已经是两者之差的负值
positive_condition:
ret ; 结束函数并返回
; 注意:这只是一个基本的示例,实际应用中可能需要处理更多的边界情况,并且在Windows环境中,你可能会更倾向于使用C++或其他高一级的语言来实现这个功能。
阅读全文