#pragma once

#include "refC一定間隔処理.h"

namespace FDK
{
	public ref class CFPS
	{
	public:
		property int n現在のFPS
		{
			int get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CFPS" );
				
				lock l( this->lock値 );
				return this->_n現在のFPS;
			}
		protected:
			void set( int value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CFPS" );

				lock l( this->lock値 );
				this->_n現在のFPS = value;
			}
		}
		property bool bFPSの値が変化した
		{
			bool get()
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CFPS" );

				lock l( this->lock値 );
				return this->_bFPSの値が変化した;
			}
		protected:
			void set( bool value )
			{
				this->Disposed->tDispose済みまたは実行中なら例外発生( "CFPS" );

				lock l( this->lock値 );
				this->_bFPSの値が変化した = value;
			}
		}
	
		CFPS()
		{
			this->Disposed = gcnew CDisposed();

			this->lock値 = gcnew Object();

			lock l( this->lock値 );

			this->_n現在のFPS = 0;
			this->_bFPSの値が変化した = false;
			this->_n内部FPS = 0;

			this->m一定間隔処理 = gcnew C一定間隔処理();
			this->t進行 = gcnew C一定間隔処理::dg処理( this, &CFPS::t進行処理 );
		}
		~CFPS()
		{
			if( this->Disposed->bDispose済みまたは処理中である )
				return;		// 例外は発出させない。

			if( !this->Disposed->t開始を宣言する() )
				return;		// 例外は発出させない。


			SAFE_REF_DELETE( this->t進行 );
			SAFE_REF_DELETE( this->m一定間隔処理 );
			SAFE_REF_DELETE( this->lock値 );

			//GC::SuppressFinalize( this );   --> コンパイラが勝手にやる
		}

		void tカウンタ更新()
		{
			this->Disposed->tDispose済みまたは実行中なら例外発生( "CFPS" );

			lock l( this->lock値 );

			this->_bFPSの値が変化した = false;
			this->_n内部FPS++;

			this->m一定間隔処理->t進行( 1000, this->t進行 );
		}

	protected:
		C一定間隔処理^ m一定間隔処理;
		C一定間隔処理::dg処理^ t進行;
		
		void t進行処理()
		{
			this->Disposed->tDispose済みまたは実行中なら例外発生( "CFPS" );

			lock l( this->lock値 );

			_n現在のFPS = _n内部FPS;
			_n内部FPS = 0;
			_bFPSの値が変化した = true;
		}
	
	private:
		CDisposed^ Disposed;
		int _n現在のFPS;
		bool _bFPSの値が変化した;
		int _n内部FPS;
		Object^ lock値;	// 上記3つの排他用
	};
}
