using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.IO; namespace M423project { public struct MessageInfo { public DateTime Time; public string Message; public bool DisplayRequired; } public class MessageHandler { private string _lastFileName = string.Empty; private StreamWriter _logWriter = null; private static MessageHandler _messageHandler = null; private Queue _messagePool; private MainForm _mainForm = null; private Thread _thread = null; public MessageHandler(MainForm mainForm) { _messagePool = new Queue(); _mainForm = mainForm; } public static MessageHandler MessageHandlerInstance { get { if (_messageHandler == null) _messageHandler = new MessageHandler(CommonUtil.mainForm); return _messageHandler; } } public void Open() { _thread = new Thread(Execute); _thread.Start(); } public void Close() { if (_thread != null) { _thread.Abort(); _thread.Join(); } } public void NewMessage(string logInfo, bool displayRequired = false) { DateTime dt = DateTime.Now; lock(this) { _messagePool.Enqueue(new MessageInfo() { Message = logInfo, Time = dt, DisplayRequired = displayRequired }); } } private void Execute() { List lmi = new List(); try { while (true) { lmi.Clear(); lock (this) { while (_messagePool.Count > 0) lmi.Add(_messagePool.Dequeue()); } foreach (MessageInfo mi in lmi) { string logFile = CommonUtil.DayDir + @"\log\" + mi.Time.ToString("yyyyMMddHH") + ".log"; if (logFile != _lastFileName) { if (_logWriter != null) _logWriter.Close(); _logWriter = new StreamWriter(logFile, true); _lastFileName = logFile; } string infoString = string.Format("{0} {1}", mi.Time.ToString("yyyyMMdd HH:mm:ss:ffffff"), mi.Message); _logWriter.WriteLine(infoString); if (mi.DisplayRequired) { if (_mainForm.IsHandleCreated) _mainForm.Invoke(new Action(() => { _mainForm.DisplayMessage(infoString); })); } Thread.Sleep(50); } if (lmi.Count > 0) _logWriter.Flush(); Thread.Sleep(100); } } catch (ThreadAbortException) { } catch (Exception) { } finally { if (_logWriter != null) _logWriter.Close(); } } } }