protected override void PerformMainLoopService() { int pid = 0; string mesg = null; bool dataReady = isUsable && DBWIN_DATA_READY.WaitOne(TimeSpan.Zero); if (dataReady) { pid = DBWIN_BUFFER_Accessor.ReadInt32(0); int readMesgBytes = DBWIN_BUFFER_Accessor.ReadArray(4, mesgByteBuffer, 0, bufferSize); int len = bufferSize; for (int idx = 0; idx < len; idx++) { if (mesgByteBuffer[idx] == 0) { len = idx; } } mesg = ByteArrayTranscoders.ByteStringTranscoder.Encode(mesgByteBuffer, 0, len); mesgByteBuffer.Clear(); DBWIN_BUFFER_Accessor.WriteArray(0, zeroBuffer, 0, zeroBuffer.Length); DBWIN_DATA_READY.Reset(); DBWIN_BUFFER_READY.Set(); } if (BaseState.IsOnline && pid != 0 && !mesg.IsNullOrEmpty()) { Func <System.Diagnostics.Process> func = (() => System.Diagnostics.Process.GetProcessById(pid)); System.Diagnostics.Process sendingProcess = func.TryGet(); Tuple <Logging.ILogger, Logging.IMesgEmitter> pidTuple = null; if (tupleDictionary.TryGetValue(pid, out pidTuple) && pidTuple != null) { if (sendingProcess != null && !pidTuple.Item1.Name.EndsWith(sendingProcess.ProcessName)) { pidTuple = null; } } if (pidTuple == null) { string loggerName; if (sendingProcess != null) { loggerName = "{0}.pid{1}.{2}".CheckedFormat(PartID, pid, sendingProcess.ProcessName); } else { loggerName = "{0}.pid{1}".CheckedFormat(PartID, pid); } Logging.ILogger logger = new Logging.Logger(loggerName); Logging.IMesgEmitter emitter = logger.Emitter(generateMesgType); pidTuple = Tuple.Create(logger, emitter); tupleDictionary[pid] = pidTuple; } if (pidTuple != null) { pidTuple.Item2.Emit("{0}", mesg.TrimEnd(' ', '\t', '\r', '\n')); } } }
protected override bool WaitForSomethingToDo(IWaitable waitable, TimeSpan useWaitTimeLimit) { bool wasSignaled = isUsable ? DBWIN_DATA_READY.WaitOne(useWaitTimeLimit) : waitable.Wait(useWaitTimeLimit); return(wasSignaled); }