[성현모] CPXV2 Init
This commit is contained in:
@ -0,0 +1,771 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
using System.IO.MemoryMappedFiles;
|
||||
using System.Threading;
|
||||
using System.Runtime.InteropServices;
|
||||
using SystemX.Net.BaseProtocol;
|
||||
using SystemX.Common.Serialization;
|
||||
using static SystemX.Net.Platform.Common.Util.LogMessage;
|
||||
|
||||
namespace SystemX.Net.Platform.SystemX.Common
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1), Serializable]
|
||||
public struct InfoLogMappedPacket
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024, ArraySubType = UnmanagedType.Bool)]
|
||||
public bool[] bLogDataReady;
|
||||
}
|
||||
//------------------------------------------------------------------------------------------
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1), Serializable]
|
||||
public struct LogMappedPacket
|
||||
{
|
||||
//Use State
|
||||
[MarshalAs(UnmanagedType.Bool)]
|
||||
public bool bSectionUse;
|
||||
|
||||
//Host
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_16[] objLogType;
|
||||
|
||||
//This File Process Result 1
|
||||
[MarshalAs(UnmanagedType.Bool)]
|
||||
public bool bLogFileReadComplete;
|
||||
|
||||
//This File Process Result 2
|
||||
[MarshalAs(UnmanagedType.Bool)]
|
||||
public bool bLogFileProcessComplete;
|
||||
|
||||
//Number
|
||||
[MarshalAs(UnmanagedType.I4)]
|
||||
public int nNumber;
|
||||
|
||||
//Use Log Process Time
|
||||
[MarshalAs(UnmanagedType.Bool)]
|
||||
public bool bShowCpLogProcessTime;
|
||||
|
||||
//COMMAND 포트 번호
|
||||
[MarshalAs(UnmanagedType.I4)]
|
||||
public int nCommandPort;
|
||||
|
||||
//STREAM 포트 번호
|
||||
[MarshalAs(UnmanagedType.I4)]
|
||||
public int nStreamPort;
|
||||
|
||||
//Station ID
|
||||
[MarshalAs(UnmanagedType.I4)]
|
||||
public int nStationID;
|
||||
|
||||
//Host
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_64[] objHost;
|
||||
|
||||
//Section
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_64[] objSection;
|
||||
|
||||
//Option File Name
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_64[] objOptionFileName;
|
||||
|
||||
//Option File Name
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_16[] objOptionFileExtension;
|
||||
|
||||
//Station Name
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_64[] objStationName;
|
||||
|
||||
//Prod P
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_16[] objProdPNo;
|
||||
|
||||
//Prod C
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_16[] objProdCNo;
|
||||
|
||||
//Test Type
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_16[] objTestType;
|
||||
|
||||
//Test Code
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_16[] objTestCode;
|
||||
|
||||
//Version
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_16[] objVersion;
|
||||
|
||||
//Prod Code
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_16[] objProdCode;
|
||||
|
||||
//Test List Variant No
|
||||
[MarshalAs(UnmanagedType.I4)]
|
||||
public int nTestListVariantNo;
|
||||
|
||||
//Test List Load Cnt ID
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
|
||||
public STRING_256[] objResultTestListCntID;
|
||||
|
||||
public byte[] Data() { return ucLogData; }
|
||||
|
||||
//Test List Variant No
|
||||
[MarshalAs(UnmanagedType.I4)]
|
||||
public int nLogDataSize;
|
||||
|
||||
//Log File 1MB 까지
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024000, ArraySubType = UnmanagedType.U1)]
|
||||
public byte[] ucLogData;
|
||||
}
|
||||
//------------------------------------------------------------------------------------------
|
||||
public class CMapParameter
|
||||
{
|
||||
public string strSetEnterMutexName;
|
||||
public string strSetAccessMutexName;
|
||||
public string strSetPath;
|
||||
public string strSetFileName;
|
||||
public string strSetMapName;
|
||||
}
|
||||
|
||||
public class SharedMemory
|
||||
{
|
||||
//Keep the mutex as static to prevent early garbage collection
|
||||
public const int nMaxStationSize = 8;
|
||||
|
||||
//Keep the mutex as static to prevent early garbage collection
|
||||
public const int nMaxInfoFullAccessSize = 1024;
|
||||
|
||||
protected byte[] ucCurrentArr;
|
||||
protected int nSize;
|
||||
|
||||
private bool bDisposed;
|
||||
|
||||
protected CMapParameter ParameterMap;
|
||||
|
||||
public SharedMemory(CMapParameter SetParameter)
|
||||
{
|
||||
bDisposed = false;
|
||||
|
||||
ParameterMap = new CMapParameter();
|
||||
ParameterMap.strSetEnterMutexName = SetParameter.strSetEnterMutexName;
|
||||
ParameterMap.strSetAccessMutexName = SetParameter.strSetAccessMutexName;
|
||||
ParameterMap.strSetPath = SetParameter.strSetPath;
|
||||
ParameterMap.strSetFileName = SetParameter.strSetFileName;
|
||||
ParameterMap.strSetMapName = SetParameter.strSetMapName;
|
||||
}
|
||||
|
||||
protected byte[] StructToByte(object obj)
|
||||
{
|
||||
int size = Marshal.SizeOf(obj);
|
||||
byte[] arr = new byte[size];
|
||||
IntPtr ptr = Marshal.AllocHGlobal(size);
|
||||
Marshal.StructureToPtr(obj, ptr, true);
|
||||
Marshal.Copy(ptr, arr, 0, size);
|
||||
Marshal.FreeHGlobal(ptr);
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
protected T ByteToStruct<T>(byte[] buffer) where T : struct
|
||||
{
|
||||
int size = Marshal.SizeOf(typeof(T));
|
||||
|
||||
if (size > buffer.Length)
|
||||
throw new Exception();
|
||||
|
||||
IntPtr ptr = Marshal.AllocHGlobal(size);
|
||||
Marshal.Copy(buffer, 0, ptr, size);
|
||||
T obj = (T)Marshal.PtrToStructure(ptr, typeof(T));
|
||||
Marshal.FreeHGlobal(ptr);
|
||||
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
public class LogSharedMemory : SharedMemory, IDisposable
|
||||
{
|
||||
//private static object _numLock;
|
||||
|
||||
//private static Mutex _mutex;
|
||||
private static Mutex _mutexSub;
|
||||
|
||||
private bool bDisposed;
|
||||
|
||||
public LogSharedMemory(CMapParameter SetParameter) : base(SetParameter)
|
||||
{
|
||||
bDisposed = false;
|
||||
}
|
||||
|
||||
static LogSharedMemory()
|
||||
{
|
||||
}
|
||||
|
||||
public void Set(int nPos, LogMappedPacket value)
|
||||
{
|
||||
bool bSubMutexResult = true;
|
||||
|
||||
try
|
||||
{
|
||||
if (!Mutex.TryOpenExisting(ParameterMap.strSetAccessMutexName + nPos.ToString("D03"), out _mutexSub))
|
||||
{
|
||||
_mutexSub = new Mutex(true, ParameterMap.strSetAccessMutexName + nPos.ToString("D03"));
|
||||
}
|
||||
else
|
||||
{
|
||||
bSubMutexResult = _mutexSub.WaitOne();
|
||||
|
||||
if (bSubMutexResult == false)
|
||||
throw new Exception("LogSharedMemory.Set failed Mutex WaitOne().");
|
||||
}
|
||||
//
|
||||
try
|
||||
{
|
||||
ucCurrentArr = StructToByte(value);
|
||||
nSize = ucCurrentArr.Count();
|
||||
|
||||
//access memory mapped file (need persistence)
|
||||
using (var memMapFile = MemoryMappedFile.CreateFromFile(
|
||||
@ParameterMap.strSetPath + ParameterMap.strSetFileName + nPos.ToString("D03"), //file location
|
||||
FileMode.OpenOrCreate, //create new file if not exist, open if exist
|
||||
ParameterMap.strSetMapName + nPos.ToString("D03"), //map name
|
||||
nSize * nMaxStationSize)) //size
|
||||
{
|
||||
//update the number to memory view
|
||||
using (var stream = memMapFile.CreateViewStream())
|
||||
using (var writer = new BinaryWriter(stream))
|
||||
{
|
||||
writer.Seek(value.nStationID * nSize, SeekOrigin.Begin);
|
||||
|
||||
writer.Write(ucCurrentArr);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : LogSharedMemory.Set[1]] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
if (bSubMutexResult)
|
||||
{
|
||||
if (_mutexSub != null)
|
||||
_mutexSub.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : LogSharedMemory.Set[2]] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
//if (_mutex != null)
|
||||
// _mutex.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
|
||||
public bool CheckFile(int nPos)
|
||||
{
|
||||
bool bCheckResult = false;
|
||||
|
||||
bool bSubMutexResult = true;
|
||||
|
||||
try
|
||||
{
|
||||
if (!Mutex.TryOpenExisting(ParameterMap.strSetAccessMutexName + nPos.ToString("D03"), out _mutexSub))
|
||||
{
|
||||
_mutexSub = new Mutex(true, ParameterMap.strSetAccessMutexName + nPos.ToString("D03"));
|
||||
}
|
||||
else
|
||||
{
|
||||
bSubMutexResult = _mutexSub.WaitOne(100);
|
||||
|
||||
if (bSubMutexResult == false)
|
||||
throw new Exception("LogSharedMemory.CheckFile failed Mutex WaitOne().");
|
||||
}
|
||||
//
|
||||
if (File.Exists(@ParameterMap.strSetPath + ParameterMap.strSetFileName + nPos.ToString("D03")))
|
||||
bCheckResult = true;
|
||||
else
|
||||
bCheckResult = false;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : LogSharedMemory.CheckFile] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
|
||||
bCheckResult = false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
if (bSubMutexResult)
|
||||
{
|
||||
if (_mutexSub != null)
|
||||
_mutexSub.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
|
||||
return bCheckResult;
|
||||
}
|
||||
public LogMappedPacket? Get(int nPos, int nStPos, out bool bFindProcessNeedLogResult, int nSetSize = int.MinValue)
|
||||
{
|
||||
LogMappedPacket? GetMappedFile = null;
|
||||
|
||||
bFindProcessNeedLogResult = false;
|
||||
|
||||
byte[] ucGetArr = null;
|
||||
|
||||
bool bSubMutexResult = true;
|
||||
|
||||
try
|
||||
{
|
||||
if (!Mutex.TryOpenExisting(ParameterMap.strSetAccessMutexName + nPos.ToString("D03"), out _mutexSub))
|
||||
{
|
||||
_mutexSub = new Mutex(true, ParameterMap.strSetAccessMutexName + nPos.ToString("D03"));
|
||||
}
|
||||
else
|
||||
{
|
||||
bSubMutexResult = _mutexSub.WaitOne();
|
||||
|
||||
if (bSubMutexResult == false)
|
||||
throw new Exception("LogSharedMemory.Get failed Mutex WaitOne().");
|
||||
}
|
||||
//
|
||||
try
|
||||
{
|
||||
if (nSetSize != int.MinValue)
|
||||
nSize = nSetSize;
|
||||
|
||||
//access memory mapped file (need persistence)
|
||||
using (var memMapFile = MemoryMappedFile.CreateFromFile(
|
||||
@ParameterMap.strSetPath + ParameterMap.strSetFileName + nPos.ToString("D03"), //file location
|
||||
FileMode.Open, //create new file if not exist, open if exist
|
||||
ParameterMap.strSetMapName + nPos.ToString("D03"), //map name
|
||||
nSize * nMaxStationSize)) //size
|
||||
{
|
||||
//get last number from memory view
|
||||
using (var stream = memMapFile.CreateViewStream())
|
||||
using (var reader = new BinaryReader(stream))
|
||||
{
|
||||
stream.Seek(nStPos * nSize, SeekOrigin.Begin);
|
||||
|
||||
ucGetArr = reader.ReadBytes(nSize);
|
||||
|
||||
GetMappedFile = ByteToStruct<LogMappedPacket>(ucGetArr);
|
||||
|
||||
if (GetMappedFile.Value.bSectionUse)
|
||||
{
|
||||
if (GetMappedFile.Value.bLogFileReadComplete == false)
|
||||
bFindProcessNeedLogResult = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : LogSharedMemory.Get[1]] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
}
|
||||
finally
|
||||
{
|
||||
/*if (File.Exists(@"D:\CpServerXLogSharedMemoryMap" + nPos.ToString("D03")))
|
||||
File.Delete(@"D:\CpServerXLogSharedMemoryMap" + nPos.ToString("D03"));*/
|
||||
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
if (bSubMutexResult)
|
||||
{
|
||||
if (_mutexSub != null)
|
||||
_mutexSub.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : LogSharedMemory.Get[2]] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
/*
|
||||
if (_mutex != null)
|
||||
_mutex.ReleaseMutex();
|
||||
*/
|
||||
}
|
||||
|
||||
return GetMappedFile;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (!bDisposed)
|
||||
{
|
||||
//Manage
|
||||
|
||||
//Unmanage
|
||||
//
|
||||
if (_mutexSub != null)
|
||||
{
|
||||
_mutexSub.Dispose();
|
||||
_mutexSub = null;
|
||||
}
|
||||
|
||||
bDisposed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public class InfoLogSharedMemory : SharedMemory, IDisposable
|
||||
{
|
||||
private static Mutex _mutex;
|
||||
private static Mutex _mutexSub;
|
||||
|
||||
//private static object _numLock;
|
||||
|
||||
private bool bDisposed;
|
||||
|
||||
public InfoLogSharedMemory(CMapParameter SetParameter) : base(SetParameter)
|
||||
{
|
||||
bDisposed = false;
|
||||
}
|
||||
|
||||
static InfoLogSharedMemory()
|
||||
{
|
||||
}
|
||||
|
||||
public void Set(InfoLogMappedPacket value)
|
||||
{
|
||||
bool bSubMutexResult = true;
|
||||
|
||||
try
|
||||
{
|
||||
if (!Mutex.TryOpenExisting(ParameterMap.strSetAccessMutexName, out _mutexSub))
|
||||
{
|
||||
_mutexSub = new Mutex(true, ParameterMap.strSetAccessMutexName);
|
||||
}
|
||||
else
|
||||
{
|
||||
bSubMutexResult = _mutexSub.WaitOne();
|
||||
|
||||
if (bSubMutexResult == false)
|
||||
throw new Exception("InfoLogSharedMemory.Set failed Mutex WaitOne().");
|
||||
}
|
||||
//
|
||||
try
|
||||
{
|
||||
ucCurrentArr = StructToByte(value);
|
||||
nSize = ucCurrentArr.Count();
|
||||
|
||||
//access memory mapped file (need persistence)
|
||||
using (var memMapFile = MemoryMappedFile.CreateFromFile(
|
||||
@ParameterMap.strSetPath + ParameterMap.strSetFileName, //file location
|
||||
FileMode.OpenOrCreate, //create new file if not exist, open if exist
|
||||
ParameterMap.strSetMapName, //map name
|
||||
nSize)) //size
|
||||
{
|
||||
//update the number to memory view
|
||||
using (var stream = memMapFile.CreateViewStream())
|
||||
using (var writer = new BinaryWriter(stream))
|
||||
{
|
||||
writer.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
writer.Write(ucCurrentArr);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : InfoLogSharedMemory.Set InfoLogMappedPacket[1]] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
if (bSubMutexResult)
|
||||
{
|
||||
if (_mutexSub != null)
|
||||
_mutexSub.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : InfoLogSharedMemory.Set InfoLogMappedPacket[2]] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
}
|
||||
}
|
||||
|
||||
public void Set(bool[] value)
|
||||
{
|
||||
bool bSubMutexResult = true;
|
||||
|
||||
try
|
||||
{
|
||||
if (!Mutex.TryOpenExisting(ParameterMap.strSetAccessMutexName, out _mutexSub))
|
||||
{
|
||||
_mutexSub = new Mutex(true, ParameterMap.strSetAccessMutexName);
|
||||
}
|
||||
else
|
||||
{
|
||||
bSubMutexResult = _mutexSub.WaitOne();
|
||||
|
||||
if (bSubMutexResult == false)
|
||||
throw new Exception("InfoLogSharedMemory.Set failed Mutex WaitOne().");
|
||||
}
|
||||
//
|
||||
try
|
||||
{
|
||||
InfoLogMappedPacket InfoLogMapFile = new InfoLogMappedPacket();
|
||||
int nSetSize = Marshal.SizeOf(InfoLogMapFile);
|
||||
byte[] ucSetLogArray = new byte[nSetSize];
|
||||
InfoLogMapFile = (InfoLogMappedPacket)SystemXNetSerialization.RawDeSerialize(ucSetLogArray, InfoLogMapFile.GetType());
|
||||
|
||||
Array.Copy(value, 0, InfoLogMapFile.bLogDataReady, 0, nMaxInfoFullAccessSize);
|
||||
|
||||
ucCurrentArr = StructToByte(InfoLogMapFile);
|
||||
nSize = ucCurrentArr.Count();
|
||||
|
||||
//access memory mapped file (need persistence)
|
||||
using (var memMapFile = MemoryMappedFile.CreateFromFile(
|
||||
@ParameterMap.strSetPath + ParameterMap.strSetFileName, //file location
|
||||
FileMode.OpenOrCreate, //create new file if not exist, open if exist
|
||||
ParameterMap.strSetMapName, //map name
|
||||
nSize)) //size
|
||||
{
|
||||
//update the number to memory view
|
||||
using (var stream = memMapFile.CreateViewStream())
|
||||
using (var writer = new BinaryWriter(stream))
|
||||
{
|
||||
writer.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
writer.Write(ucCurrentArr);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : InfoLogSharedMemory.Set bool[][1]] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
if (bSubMutexResult)
|
||||
{
|
||||
if (_mutexSub != null)
|
||||
_mutexSub.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : InfoLogSharedMemory.Set bool[][2]] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
}
|
||||
}
|
||||
|
||||
public bool ForceCheckFile()
|
||||
{
|
||||
bool bCheckResult = false;
|
||||
|
||||
bool bSubMutexResult = true;
|
||||
|
||||
try
|
||||
{
|
||||
if (!Mutex.TryOpenExisting(ParameterMap.strSetAccessMutexName, out _mutexSub))
|
||||
{
|
||||
_mutexSub = new Mutex(true, ParameterMap.strSetAccessMutexName);
|
||||
}
|
||||
else
|
||||
{
|
||||
bSubMutexResult = _mutexSub.WaitOne();
|
||||
|
||||
if (bSubMutexResult == false)
|
||||
throw new Exception("InfoLogSharedMemory.CheckFile failed Mutex WaitOne().");
|
||||
}
|
||||
//
|
||||
if (File.Exists(@ParameterMap.strSetPath + ParameterMap.strSetFileName))
|
||||
bCheckResult = true;
|
||||
else
|
||||
bCheckResult = false;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : InfoLogSharedMemory.CheckFile] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
|
||||
bCheckResult = false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
if (bSubMutexResult)
|
||||
{
|
||||
if (_mutexSub != null)
|
||||
_mutexSub.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
|
||||
return bCheckResult;
|
||||
}
|
||||
|
||||
public bool CheckExistsInfoFile()
|
||||
{
|
||||
if (File.Exists(@ParameterMap.strSetPath + ParameterMap.strSetFileName))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool CheckFile()
|
||||
{
|
||||
bool bCheckResult = false;
|
||||
|
||||
bool bSubMutexResult = true;
|
||||
|
||||
try
|
||||
{
|
||||
if (!Mutex.TryOpenExisting(ParameterMap.strSetAccessMutexName, out _mutexSub))
|
||||
{
|
||||
_mutexSub = new Mutex(true, ParameterMap.strSetAccessMutexName);
|
||||
}
|
||||
else
|
||||
{
|
||||
bSubMutexResult = _mutexSub.WaitOne(100);
|
||||
|
||||
if (bSubMutexResult == false)
|
||||
throw new Exception("InfoLogSharedMemory.CheckFile failed Mutex WaitOne().");
|
||||
}
|
||||
//
|
||||
if (File.Exists(@ParameterMap.strSetPath + ParameterMap.strSetFileName))
|
||||
bCheckResult = true;
|
||||
else
|
||||
bCheckResult = false;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : InfoLogSharedMemory.CheckFile] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
|
||||
bCheckResult = false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
if (bSubMutexResult)
|
||||
{
|
||||
if (_mutexSub != null)
|
||||
_mutexSub.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
|
||||
return bCheckResult;
|
||||
}
|
||||
|
||||
public bool[] Get(out bool bFindInfoLogResult, int nSetSize = int.MinValue)
|
||||
{
|
||||
bFindInfoLogResult = false;
|
||||
|
||||
bool[] bGetInfoLogStation = new bool[nMaxInfoFullAccessSize];
|
||||
|
||||
byte[] ucGetArr = null;
|
||||
|
||||
bool bSubMutexResult = true;
|
||||
|
||||
try
|
||||
{
|
||||
if (!Mutex.TryOpenExisting(ParameterMap.strSetAccessMutexName, out _mutexSub))
|
||||
{
|
||||
_mutexSub = new Mutex(true, ParameterMap.strSetAccessMutexName);
|
||||
}
|
||||
else
|
||||
{
|
||||
bSubMutexResult = _mutexSub.WaitOne();
|
||||
|
||||
if (bSubMutexResult == false)
|
||||
throw new Exception("InfoLogSharedMemory.Get failed Mutex WaitOne().");
|
||||
}
|
||||
//
|
||||
try
|
||||
{
|
||||
if (nSetSize != int.MinValue)
|
||||
nSize = nSetSize;
|
||||
|
||||
//access memory mapped file (need persistence)
|
||||
using (var memMapFile = MemoryMappedFile.CreateFromFile(
|
||||
@ParameterMap.strSetPath + ParameterMap.strSetFileName, //file location
|
||||
FileMode.Open, //create new file if not exist, open if exist
|
||||
ParameterMap.strSetMapName, //map name
|
||||
nSize)) //size
|
||||
{
|
||||
//get last number from memory view
|
||||
using (var stream = memMapFile.CreateViewStream())
|
||||
using (var reader = new BinaryReader(stream))
|
||||
{
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
ucGetArr = reader.ReadBytes(nSize);
|
||||
|
||||
InfoLogMappedPacket GetInfoMappedFile = ByteToStruct<InfoLogMappedPacket>(ucGetArr);
|
||||
|
||||
Array.Copy(GetInfoMappedFile.bLogDataReady, 0, bGetInfoLogStation, 0, nMaxInfoFullAccessSize);
|
||||
|
||||
bFindInfoLogResult = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : InfoLogSharedMemory.Get[1]] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
}
|
||||
finally
|
||||
{
|
||||
/*if (File.Exists(@"D:\CpServerXLogSharedMemoryMap" + nPos.ToString("D03")))
|
||||
File.Delete(@"D:\CpServerXLogSharedMemoryMap" + nPos.ToString("D03"));*/
|
||||
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
if (bSubMutexResult)
|
||||
{
|
||||
if (_mutexSub != null)
|
||||
_mutexSub.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageOutput.ConsoleWrite(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss>>") + " [SystemX.Net.Platform.SystemX.Common : InfoLogSharedMemory.Get[2]] " + e.Message, ConsoleColor.Yellow, LogMessageLevel.DEBUG);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//release the mutex for other process to access the memory mapped file
|
||||
}
|
||||
|
||||
return bGetInfoLogStation;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (!bDisposed)
|
||||
{
|
||||
//Manage
|
||||
//
|
||||
//Unmanag
|
||||
|
||||
if (_mutexSub != null)
|
||||
{
|
||||
_mutexSub.Dispose();
|
||||
_mutexSub = null;
|
||||
}
|
||||
|
||||
bDisposed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user