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<MessageInfo> _messagePool;
|
private MainForm _mainForm = null;
|
private Thread _thread = null;
|
public MessageHandler(MainForm mainForm)
|
{
|
_messagePool = new Queue<MessageInfo>();
|
_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<MessageInfo> lmi = new List<MessageInfo>();
|
|
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();
|
}
|
}
|
}
|
}
|