mytimer.cpp

来自「实现了无线传感器网络中的一个路由协议算法。」· C++ 代码 · 共 148 行

CPP
148
字号
// MyTimer.cpp: implementation of the CMyTimer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SimSensor.h"
#include "MyTimer.h"
#include "MsgCenter.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//IMPLEMENT_DYNCREATE(CMyTimer, CObject)

CMyTimer::CMyTimer() 
{
	m_pNode = NULL;
	m_DelayTime = 0;
	m_hTimer = NULL;
	m_TimeType = TRUE;
	m_StartTime = 0;
	m_TimeCha = 0;
	m_Stop = FALSE;
}

CMyTimer::~CMyTimer()
{

}


void CMyTimer::SendTimerMsg(LPVOID pNode, UINT MsgType)
{ 
	CMsg *pMsg ;
	pMsg = new CMsg;
	pMsg->Type = MsgType;               //collectdata Msg
	((CNode *)pNode)->MsgBuff.InsertMsg(pMsg);
}

DWORD WINAPI CMyTimer::TimerProc(LPVOID lpParam)
{
	CMyTimer *pTimer = (CMyTimer *)lpParam;
	CNode *pNode = (CNode *)(pTimer->m_pNode);

    if (pNode == NULL || !pNode->IsKindOf(RUNTIME_CLASS(CNode)))  return 0;   // if pObject is not valid

	if ( ONCE == pTimer->m_TimeType ) {
		//while(1) {
		//	if ( TRUE == pTimer->m_Stop ) {
		//	    pTimer->m_Stop = FALSE;
		//		break;
		//	}

			pTimer->m_StartTime = GetTickCount(); 
			do {
				if ( TRUE == pTimer->m_Stop ) {
					pTimer->m_Stop = FALSE;
					break;
				}
				Sleep(1);
				pTimer->m_TimeCha = GetTickCount() - pTimer->m_StartTime;		
			}while (pTimer->m_TimeCha < pTimer->m_DelayTime );
			pTimer->m_TimeCha = 0;
			//::MessageBox(NULL,"Timer ONCE arrived!","hehe",MB_OK);
			pTimer->SendTimerMsg(pNode,100);
			//pTimer->StopTimer();
		//}
		return 1;
	}else{
		while(1) {
			if ( TRUE == pTimer->m_Stop ) {
			    pTimer->m_Stop = FALSE;
				break;
			}

			pTimer->m_StartTime = GetTickCount(); 
			do {	
				Sleep(1);
				pTimer->m_TimeCha = GetTickCount() - pTimer->m_StartTime;	
			}while ( pTimer->m_TimeCha < pTimer->m_DelayTime );			
            pTimer->m_TimeCha = 0;
			//::MessageBox(NULL,"Timer CONTINUE arrived!","hehe",MB_OK);
			pTimer->SendTimerMsg(pNode,101);
		}
		return 2;
	}
}

BOOL CMyTimer::SetMyTimer(DWORD Time,UINT TimeType)
{
    m_DelayTime = Time;
	m_TimeType = TimeType;

	m_hTimer=::CreateThread(NULL,0,TimerProc,(LPVOID)(this),0,NULL);
	if ( m_hTimer!=NULL ) {
		SetThreadPriority(m_hTimer,THREAD_PRIORITY_HIGHEST);
		return TRUE;
	}else{
		//TRACE("Timer Set Fail!\n");
		MessageBox(NULL,"Timer Set Fail!","warning!",MB_OK);
		return FALSE; 
	}	
}

BOOL CMyTimer::EndTimer()
{
 	DWORD RetCode;
	if (!GetExitCodeThread(m_hTimer,&RetCode)) return FALSE; 

	if (STILL_ACTIVE!=RetCode) return TRUE; 
 
 	m_Stop = TRUE;
    if (m_TimeType == ONCE) ContinueTimer();

    if ( m_Stop==FALSE ) 
		return TRUE;
    else 
		return FALSE;
}

BOOL CMyTimer::StopTimer()
{
	if (0xFFFFFFFF == SuspendThread(m_hTimer)) 
		return FALSE;
	else
		return TRUE;
}

BOOL CMyTimer::ContinueTimer()
{
 	if (0xFFFFFFFF == ResumeThread(m_hTimer)) 
		return FALSE;
	else
		return TRUE;
}

VOID CMyTimer::BandNode(LPVOID pNode)
{
    m_pNode = pNode;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?