#include "StdAfx.h" #include "akAOISharedSystem.h" #include #define SHAREDMEMNAME "DIT.AOISYSTEM.SHAREDMEM" CakAOISharedSystem::CakAOISharedSystem(void) : m_mxSignalProcess(FALSE, _T("IPC_NETWORKSYSTEM_MUTEX")) { m_pParent = NULL; m_nThreadSignalFlag = 0; m_pIPCAOISystem = NULL; m_hMapIPCAOISystem = NULL; InitializeCriticalSection(&m_csSignalProcess); } CakAOISharedSystem::~CakAOISharedSystem(void) { if(m_nThreadSignalFlag == 1) m_nThreadSignalFlag = 2; while(m_nThreadSignalFlag != 0) { Sleep(0); } if (m_pIPCAOISystem!=NULL) { ::UnmapViewOfFile(m_pIPCAOISystem); m_pIPCAOISystem = NULL; } if (m_hMapIPCAOISystem != NULL) { ::CloseHandle(m_hMapIPCAOISystem); m_hMapIPCAOISystem = NULL; } } bool CakAOISharedSystem::Create( CWnd* pParent, emSystemType SystemType) { if(m_pIPCAOISystem) return false; m_SystemType = SystemType; BOOL bCreateSharedMem = FALSE;//°øÀ¯¸Þ¸ð¸® »ý¼º [±èÅÂÇö 2018/9/10] { BOOL bCreateMem = TRUE; m_hMapIPCAOISystem = ::CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE , 0, sizeof(_IPCAOISystem), SHAREDMEMNAME); if (::GetLastError() == ERROR_ALREADY_EXISTS) { m_hMapIPCAOISystem = ::OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,SHAREDMEMNAME); bCreateMem = FALSE; } if (m_hMapIPCAOISystem) { m_pIPCAOISystem = (_IPCAOISystem*)::MapViewOfFile(m_hMapIPCAOISystem, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(_IPCAOISystem)); if (m_pIPCAOISystem) { bCreateSharedMem = TRUE; } } //0À¸·Î ÃʱâÈ­ if(bCreateMem && m_pIPCAOISystem) ZeroMemory(m_pIPCAOISystem,sizeof(_IPCAOISystem)); } if(bCreateSharedMem == FALSE) return false; m_pParent = pParent; _beginthread(threadSignal, NULL, this); return true; } void CakAOISharedSystem::threadSignal( void* arg ) { CakAOISharedSystem* pThis = (CakAOISharedSystem*)arg; pThis->m_nThreadSignalFlag = 1; pThis->processSignal(); pThis->m_nThreadSignalFlag = 0; } void CakAOISharedSystem::processSignal() { char m_nSignalPreAOI[INA_SIGNALNUM]={}; char m_nSignalCurAOI[INA_SIGNALNUM]={}; char m_nSignalPreReview[INA_SIGNALNUM]={}; char m_nSignalCurReview[INA_SIGNALNUM]={}; DWORD dwTickCount =0; while(m_nThreadSignalFlag == 1) { dwTickCount = GetTickCount(); m_mxSignalProcess.Lock(); memcpy(m_nSignalCurAOI, getAOIProtocol()->m_nSignal, sizeof(char)*INA_SIGNALNUM); memcpy(m_nSignalCurReview, getReviewProtocol()->m_nSignal, sizeof(char)*INA_SIGNALNUM); m_mxSignalProcess.Unlock(); //Signal °¨Áö ºÎºÐ [±èÅÂÇö 2018/9/10] { for(int i=0; i=0; i--) { if(m_vecSignalTimeOff[i].nTimeBitOff < dwTickCount) { *m_vecSignalTimeOff[i].pSignal = 0; m_vecSignalTimeOff.erase(m_vecSignalTimeOff.begin()+i); } else if(*m_vecSignalTimeOff[i].pSignal == 0) { m_vecSignalTimeOff.erase(m_vecSignalTimeOff.begin()+i); } } LeaveCriticalSection(&m_csSignalProcess); } memcpy(m_nSignalPreAOI, m_nSignalCurAOI, sizeof(char)*INA_SIGNALNUM); memcpy(m_nSignalPreReview, m_nSignalCurReview, sizeof(char)*INA_SIGNALNUM); Sleep(50); } } bool CakAOISharedSystem::SetSignal( emSystemType nSystemType, int nSignalIndex, int nTimeMS /*= 500*/ ) { char* pSignal = NULL; if(nSystemType == ST_AOI) { pSignal = &getAOIProtocol()->m_nSignal[nSignalIndex]; } else if(nSystemType == ST_Review) { pSignal = &getReviewProtocol()->m_nSignal[nSignalIndex]; } EnterCriticalSection(&m_csSignalProcess); for(int i=0; iPostMessage(UM_IPCNETAOISYSTEM, nSignal, (int)nSystemType); }