#pragma once
//#include "FSNIAlgo.h"
#include "Windows.h"
#include <queue>
#define MINALGOSIZE 1
template<class T>
class FSNIObjPool
{
public:
FSNIObjPool(void);
~FSNIObjPool(void);
void AlloAlgoPool();
T* GetAlgoObj();
void ReleaseAlgoObj(T *p);
void DeleteAlgoObj(T *obj);
private:
HANDLE m_hAlgoMutex;
std::queue<T *> m_queAlgoPool;
};
<pre name="code" class="cpp">#include "StdAfx.h"
#include "FSNIObjPool.h"
template<typename T>
FSNIObjPool<T>::FSNIObjPool(void)
{
m_hAlgoMutex = CreateMutex(NULL, FALSE, NULL);
if (!m_hAlgoMutex)
{
printf("CreateMutex failed, error id=%d!!!!!", GetLastError());
}
}
template<typename T>
FSNIObjPool<T>::~FSNIObjPool(void)
{
int i = m_queAlgoPool.size();
while(m_queAlgoPool.size()>0)
{
T *fsni = m_queAlgoPool.front();
m_queAlgoPool.pop();
DeleteAlgoObj(fsni);
}
}
template<typename T>
void FSNIObjPool<T>::AlloAlgoPool()
{
for (int i=0; i<MINALGOSIZE; i++)
{
T *algo = new T();
algo->InitFaceObj();
m_queAlgoPool.push(algo);
}
}
template<typename T>
T* FSNIObjPool<T>::GetAlgoObj()
{
WaitForSingleObject(m_hAlgoMutex, INFINITE);
for (int i=0; i<m_queAlgoPool.size(); i++)
{
T *fsni = m_queAlgoPool.front();
m_queAlgoPool.pop();
ReleaseMutex(m_hAlgoMutex);
return fsni;
}
T *fsni = new T;
fsni->InitFaceObj();
ReleaseMutex(m_hAlgoMutex);
return fsni;
}
template<typename T>
void FSNIObjPool<T>::ReleaseAlgoObj(T *p)
{
WaitForSingleObject(m_hAlgoMutex, INFINITE);
m_queAlgoPool.push(p);
ReleaseMutex(m_hAlgoMutex);
}
template<typename T>
void FSNIObjPool<T>::DeleteAlgoObj(T *obj)
{
delete obj;
}