GetTickCount() 用法, 一个实用的类CTickCount32中实现DoEvents()方法防止界面卡死。

  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);
}

执行效果,点击按钮后,将时间填入到下面的两个方框中。并且界面不会卡死

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值