#pragma once
#include "FDDStd326.h"

#define PER_THREADED_MODEL 0

#if (PER_THREADED_MODEL)
#include <thread>
#include <mutex>
#include <condition_variable>
#endif

class CPeriodicProc
{
		double  fFDDTicks;
		double  fFDD_Mod;
		CFDDStd326* m_pFDD;

#if (PER_THREADED_MODEL)
		void                StopThread();
		bool                StartThread();
		void                ExecuteThreadFunc();    //собственно функция
		std::thread         m_ExecuteThread;
		bool                m_bThreadTerminate;   //флаг завершения потока
		bool                m_bNotify;  //флаг от ложных пробуждений потока
		std::mutex          m_mutThr;   //мутекс потока. залочен пока поток живой
		std::mutex          m_mutex;    //мутекс для синхронизации
		std::condition_variable m_cv;   //условная переменная, чтоб будить поток, когда надо
#endif

	public:
		CPeriodicProc();
		virtual ~CPeriodicProc();
		void                init();
		void                clear();
		void                uninit();
		inline void         SetMod(const double f)
		{
			fFDD_Mod = f;
		}
		inline void         SetTicks(const double f)
		{
			fFDDTicks = f;
		}
		inline double       GetTicks()
		{
			return fFDDTicks;
		}
		void                clock();
		void				setFDD(CFDDStd326* pFDD)
		{
			m_pFDD = pFDD;
		}
};

