bool CSMOption::Init(key_t key, uint32 u4Size, uint32 u4ObjectCount, bool& blIsCreate)
{
	bool blIsLinuxFirst = false;
	//得到共享内存大小
	//1字节当前共享内存状态,0是未初始化,1是已初始化
	//4字节的共享内存更新信息,由watch维护更新
	uint32 u4MemorySize = sizeof(uint8) + sizeof(uint32) + sizeof(_SMHeader)*u4ObjectCount + u4Size*u4ObjectCount;
#ifdef WIN32
	if(m_pShareMemory == NULL)
	{
		m_pShareMemory = new ACE_Shared_Memory_MM(key, u4MemorySize);
	}
#else
	if(m_pShareMemory == NULL)
	{
		m_pShareMemory = new ACE_Shared_Memory_SV();
		//先尝试打开共享内存
		int nError = m_pShareMemory->open(key, u4MemorySize, ACE_Shared_Memory_SV::ACE_OPEN);
		if(nError != 0)
		{
			//创建共享内存
			nError = m_pShareMemory->open(key, u4MemorySize, ACE_Shared_Memory_SV::ACE_CREATE);
			if(nError != 0)
			{
				OUR_DEBUG((LM_ERROR, "[CSMOption::Init]create share memory fail(%d).\n", errno));
			}
			blIsLinuxFirst = true;
		}
		blIsCreate = true;
	}
#endif
	m_pData = (char *)m_pShareMemory->malloc();
	if(NULL == m_pData)
	{
		//PRINTF("[CSMOption::Init]open share memory fail.\n");
		return false;
	}

	if(true == blIsLinuxFirst)
	{
		ACE_OS::memset(m_pData, 0, u4MemorySize);
	}
	
	m_u4ObjectCount = u4ObjectCount;
	m_u4BufferSize  = u4Size;

	//是否初始化共享内存
	bool blState = GetInitState();
	if(true == blState)
	{
		Init_Memory();
	}
	else
	{
		Init_Memory();
		blIsCreate = false;
	}

	return true;
}
Spike_Logger::Spike_Logger(void) : DefaultGUIModel("Delayed Buffer To Log",::vars,::num_vars) {
	setWhatsThis(
	"<p><b>Delayed Buffer To Log:</b><br>This module will delay the input signal and on demand will start to output it to the loggind model</p>");
	createGUI(vars, num_vars);
	/*
	* Initialize Parameters & Variables
	*/

	Channel_A = NULL;
	Channel_B = NULL;
	Channel_C = NULL;
	Channel_D = NULL;
	Channel_E = NULL;
	Channel_F = NULL;
	Channel_G = NULL;
	Channel_H = NULL;
	Channel_I = NULL;
	Channel_J = NULL;

	Iteration_Back = 25; // default size
	Init_Memory();
	
	/*
	* Initialize the GUI
	*/
	setParameter("How Much Back?",Iteration_Back);
	refresh();

	QTimer::singleShot(0, this, SLOT(resizeMe()));
}
void Spike_Logger::update(DefaultGUIModel::update_flags_t flag) {
	if(flag == MODIFY) {
		int temp_Memory_Back   = getParameter("How Much Back?").toDouble();
		if (temp_Memory_Back != Iteration_Back){
		 Iteration_Back = temp_Memory_Back;
		 Init_Memory();		 
		}
	}
}