1 . 函数定义: DWORD GetTickCount(void);
1. 在Release版本中,该函数从0开始计时,返回自设备启动后的毫秒数(不含系统暂停时间);
2. 在Debug版本中,设备启动后便从计时器中减去180秒。这样方便测试使用该函数的代码的正确溢出处理。
3. 返回值:如正确,返回毫秒数。
4. 头文件: Winbase.h.
库文件: Coredll.lib.
5.已用时间存储为 DWORD 值。 因此,如果系统连续运行 49.7 天,时间将环绕到零。 若要避免此问题,请使用 GetTickCount64 函数。 否则,在比较时间时检查溢出条件,在第四节的类中,实现了溢出判断。
2. 应用1 - 计算操作的耗时:
DWORD Start= ::GetTickCount;
... // 执行耗时的操作
DWORD Stop= ::GetTickCount;
DWORD TimeUsed: = (Stop - Start) / 1000 ; // 使用了xxx秒
3. 应用2 - 定时操作:
DWORD dwLast;
DWORD dwCurrent;
DWORD dwInterval = 2000;
dwLast = ::GetTickCount();
CString strTimeCount;
while (true)
{
dwCurrent = ::GetTickCount();
if (dwCurrent - dwLast < dwInterval)
continue;
strTimeCount.Format(_T("%d,%d,%d "), dwLast, dwCurrent, dwCurrent - dwLast);
dwLast = dwCurrent;
AfxMessageBox(strTimeCount);
break;
}
4. 应用3 - 一个类CTickCount32及其使用,在MFC下创建1个Button按钮和2个EditControl,用DoEvent()实现计时,不卡顿。
头文件:TickCount32.h
#ifndef TickCount32_H__
#define TickCount32_H__
class CTickCount32
{
public:
CTickCount32();
virtual ~CTickCount32();
void Enter();
long GetTickCountLong(BOOL bUdate = TRUE);//获取时间差
long CalTickCountLong(DWORD dwBeginTick); //起、止时间由本函数内部计算
long CalTickCountLong2(DWORD dwBeginTick); //结束时间由m_dwTickCount传入
DWORD DoEvents(long nMs);
void EndDoEvents() { m_bEndDoEvents = TRUE; }
private:
DWORD m_dwTickCount;
BOOL m_bEndDoEvents;
long CalTickCountLong(DWORD dwEndTick, DWORD dwBeginTick);
};
#endif
源文件:cpp文件
CTickCount32::CTickCount32() //构造函数
{
Enter();
m_bEndDoEvents = FALSE;
}
CTickCount32::~CTickCount32()
{
}
void CTickCount32::Enter() //设置开始时间
{
m_dwBeginTickCount = ::GetTickCount();
}
long CTickCount32::CalTickCountLong(DWORD dwEndTick, DWORD dwBeginTick) //最终计算时间差值
{
DWORD dwLong = 0;
if (dwEndTick < dwBeginTick) //发生了翻转
{
dwLong = 0xFFFFFFFF - dwBeginTick;
dwLong += dwEndTick;
}
else
{
dwLong = dwEndTick - dwBeginTick;
}
return dwLong;
}
long CTickCount32::CalTickCountLong(DWORD dwBeginTick)
{
DWORD dwEnd = ::GetTickCount();
return CalTickCountLong(dwEnd, dwBeginTick);
}
long CTickCount32::CalTickCountLong2(DWORD dwBeginTick)
{
return CalTickCountLong(m_dwTickCount, dwBeginTick);
}
long CTickCount32::GetTickCountLong(BOOL bUdate)
{
DWORD dwEnd = ::GetTickCount();
DWORD dwLong = 0;
dwLong = CalTickCountLong(dwEnd, m_dwBeginTickCount);
if (bUdate)
{
m_dwBeginTickCount = dwEnd;
}
return dwLong;
}
DWORD CTickCount32::DoEvents(long nMs)
{
Enter();
MSG msg;
DWORD keyCode=0;
while(GetTickCountLong(FALSE) <= nMs && keyCode==0)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (m_bEndDoEvents)
{
m_bEndDoEvents = FALSE;
break;;
}
}
return keyCode;
}
调用函数
void CMFCDLGDlg::OnBnClickedSetTickcount32()
{
// TODO: 在此添加控件通知处理程序代码
CTickCount32 oTickCount32;
CString SS = _T("");
oTickCount32.DoEvents(1000);//Sleep(1000);
SS.Format(_T("时间间隔1 =%d ms"), oTickCount32.GetTickCountLong(TRUE));
SetDlgItemText(IDC_ITEM_SET_TICKCOUNT1, SS);
oTickCount32.Enter();
oTickCount32.DoEvents(2560);//Sleep(2560);
DWORD BeginTick = ::GetTickCount();
SS.Format(_T("时间间隔2 =%d ms"), oTickCount32.CalTickCountLong2(BeginTick));
SetDlgItemText(IDC_ITEM_SET_TICKCOUNT2, SS);
oTickCount32.DoEvents(3000);
}