/*
	CTimeOutMgr
	非同期タイムアウト処理を行う実行クラス
	このクラスは、グローバル上に１つだけ生成され、全ての非同期タイムアウトの処理を行う。
	非同期処理用スレッドを持つ。

	Version		: 0.0 (Release1)

	作成日		: 2002/05/25
	修正日		: ----/--/--
	改定履歴	: 
*/


#if !defined(AFX_TIMEOUTMGR_H__C7DDAD59_FAC3_421A_AA7A_0F2FE30E70F0__INCLUDED_)
#define AFX_TIMEOUTMGR_H__C7DDAD59_FAC3_421A_AA7A_0F2FE30E70F0__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "SyncObject.h"

class CTimeOut  
{
public:
	CTimeOut();
	virtual ~CTimeOut();
	void StopTimeOut();
	void SetTimeOut(int tick=0);
	virtual void OnTimeOut();
	int IsTimeOut() {return m_timeOutFlag;};

private:
	CLockObject<int>	m_timeOutFlag;

	friend class CTimeOutMgr;
};

class CTimeOutInfo  
{
public:
	CTimeOut	*m_class;
	DWORD		m_startTick;
	DWORD		m_timeOutTime;
};

typedef CArray<CTimeOutInfo,CTimeOutInfo&> CTimeOutInfoList;

class CTimeOutMgr  
{
	CCriticalSection	m_scopeLock;

public:
	static CTimeOutMgr * GetGlobalManager();
	void SetDefaultTimeOutTime(int tick);
	void DeleteTimeOut(CTimeOut *timeOut);
	void AddTimeOut(CTimeOut *timeOut,int tick=0);
	int IsRunning();
	void ThreadMain();
	CTimeOutMgr();
	virtual ~CTimeOutMgr();

private:
	void StartThread();
	static UINT WorkThread(LPVOID pParam);

	HANDLE				m_thread;
	CTimeOutInfoList	m_timeOutArray;
	int					m_break;
	int					m_defaultTimeOutTime;
};


class CTimeOutScope  
{
public:
	CTimeOutScope(CTimeOut *timeout)
	{
		m_timeout = timeout;
		m_timeout->SetTimeOut();
	};

	virtual ~CTimeOutScope()
	{
		m_timeout->StopTimeOut();
	};

	CTimeOut *m_timeout;
};

#define TIMEOUT_SCOPE()	CTimeOutScope _timeOut(this);
#define TIMEOUT_RESET()	SetTimeOut();
#define TIMEOUT_STOP()	StopTimeOut();

#endif // !defined(AFX_TIMEOUTMGR_H__C7DDAD59_FAC3_421A_AA7A_0F2FE30E70F0__INCLUDED_)
