#pragma once
#ifndef CTimerProcessor_h
#define CTimerProcessor_h
#include <boost/thread/thread.hpp>
#include "AMessageTarget.h"
#include "AObserverSubject.h"
#include "ASyncronizationClass.h"
#include "CSortedBinaryTree.h"
#include "CTimerDataItem.h"
#include "AMessageHandler.h"
namespace CoreFW
{
class CORE_DLL_DECLARATION_SPECIFIER CTimerProcessor : public AMessageTarget, public AObserverSubject
{
protected:
CTimerProcessor() ;
public:
CTimerProcessor( RESOURCE_ID_TYPE ResourceID, const std::string &strResourceName,
unsigned long ulTimerWaitTimeInMSec, AApplication *pApplication ) ;
virtual ~CTimerProcessor() ;
public:
FW_RETURN_TYPE SetTimer( AMessageHandler *pTimerHandler, long lTimerID, __int64 i64ElapsedTimeInMSec,
AMessageData *pMessageData = NULL ) ;
FW_RETURN_TYPE KillTimer( AMessageHandler *pTimerHandler, long lTimerID ) ;
FW_RETURN_TYPE KillTimer( CTimerDataItem *pTimerDataItem ) ;
FW_RETURN_TYPE KillTimerAll( AMessageHandler *pTimerHandler ) ;
FW_RETURN_TYPE Start() ;
FW_RETURN_TYPE Stop() ;
void ProcessTimerData() ;
void SetTimerWaitTimeInMSec( unsigned long ulTimerWaitTimeInMSec ) ;
unsigned long GetTimerWaitTimeInMSec() const ;
void SetEnableLogFromTimerProcessorThread( bool bEnableLogFromTimerProcessorThread ) ;
bool GetEnableLogFromTimerProcessorThread() ;
bool IsRunning() const ;
int GetSize() ;
FW_RETURN_TYPE GetTimerUsage( ALogger *pLogger ) ;
private:
void ReleaseTimerDataItems() ;
FW_RETURN_TYPE KillTimerWithoutSync( AMessageHandler *pTimerHandler, long lTimerID ) ;
protected:
FW_RETURN_TYPE StartTimerThread() ;
private:
ASyncronizationClass *m_pTimerDataItemSyncObject ;
EnumProcessorState m_eProcessorState ;
boost::thread *m_pTimerProcessorThread ;
unsigned long m_ulTimerWaitTimeInMSec ;
CSortedBinaryTree<CTimerDataItem> m_SortedBinaryTree ;
bool m_bEnableLogFromTimerProcessorThread ;
} ;
inline void CTimerProcessor::SetEnableLogFromTimerProcessorThread( bool bEnableLogFromTimerProcessorThread )
{
m_bEnableLogFromTimerProcessorThread = bEnableLogFromTimerProcessorThread ;
}
inline bool CTimerProcessor::GetEnableLogFromTimerProcessorThread()
{
return m_bEnableLogFromTimerProcessorThread ;
}
inline bool CTimerProcessor::IsRunning() const
{
return ( m_eProcessorState == PROCESSOR_STATE_RUNNING ) ;
}
inline void CTimerProcessor::SetTimerWaitTimeInMSec( unsigned long ulTimerWaitTimeInMSec )
{
m_ulTimerWaitTimeInMSec = ulTimerWaitTimeInMSec ;
}
inline unsigned long CTimerProcessor::GetTimerWaitTimeInMSec() const
{
return m_ulTimerWaitTimeInMSec ;
}
} // End namespace
#endif