Skip to content

Commit 09da9ca

Browse files
committed
The new Watcher class is written to track file changes. Appropriate sync multithreading options has been used.
1 parent 95e555a commit 09da9ca

File tree

5 files changed

+203
-128
lines changed

5 files changed

+203
-128
lines changed

CSMDevHelper/CSMDevHelper.csproj

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
<DefineConstants>DEBUG;TRACE</DefineConstants>
4040
<ErrorReport>prompt</ErrorReport>
4141
<WarningLevel>4</WarningLevel>
42+
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
4243
</PropertyGroup>
4344
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
4445
<PlatformTarget>x86</PlatformTarget>
@@ -70,6 +71,9 @@
7071
<Compile Include="CustomBindingList.cs" />
7172
<Compile Include="EventNode.cs" />
7273
<Compile Include="LibraryHandler.cs" />
74+
<Compile Include="LogFileWatcher.cs">
75+
<SubType>Component</SubType>
76+
</Compile>
7377
<Compile Include="LogReader.cs" />
7478
<Compile Include="frmCSMDH.cs">
7579
<SubType>Form</SubType>

CSMDevHelper/LogFileWatcher.cs

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.IO;
6+
using System.Threading;
7+
using System.Windows.Forms;
8+
9+
namespace CSMDevHelper
10+
{
11+
delegate void LogUpdateDelegate(LogResult logResult);
12+
13+
class LogFileWatcher: Control
14+
{
15+
Thread m_tWorker;
16+
private bool m_bStop = false;
17+
private bool m_bTail = false;
18+
private string m_sFileName = string.Empty;
19+
private enumDriverVersion m_eDriverVersion;
20+
frmCSMDH m_fParentForm;
21+
ManualResetEvent m_oPauseEvent = new ManualResetEvent(true);
22+
23+
public LogFileWatcher(string filename, enumDriverVersion driverVersion, bool tail, frmCSMDH form)
24+
{
25+
m_sFileName = filename;
26+
m_eDriverVersion = driverVersion;
27+
m_bTail = tail;
28+
LogReader.reset();
29+
m_fParentForm = form;
30+
}
31+
32+
public void run()
33+
{
34+
m_tWorker = new Thread(thread_run);
35+
m_tWorker.IsBackground = true;
36+
m_tWorker.Start();
37+
}
38+
39+
public void stop()
40+
{
41+
if (IsHandleCreated)
42+
{
43+
Invoke(new EventHandler(delegate { thread_stop(); }));
44+
}
45+
else
46+
{
47+
thread_stop();
48+
}
49+
}
50+
51+
public void pause()
52+
{
53+
m_oPauseEvent.Reset();
54+
}
55+
56+
public void resume()
57+
{
58+
m_oPauseEvent.Set();
59+
}
60+
61+
private void thread_stop()
62+
{
63+
m_bStop = true;
64+
}
65+
66+
private void thread_run()
67+
{
68+
while (!m_bStop)
69+
{
70+
m_oPauseEvent.WaitOne(Timeout.Infinite);
71+
if (File.Exists(m_sFileName) && LogReader.s_readPosition != new FileInfo(m_sFileName).Length)
72+
{
73+
if (LogReader.s_readPosition > new FileInfo(m_sFileName).Length)
74+
{
75+
LogReader.reset();
76+
}
77+
LogReader logReader = null;
78+
if (m_eDriverVersion == enumDriverVersion.CP5000)
79+
{
80+
logReader = new LogCPReader(m_sFileName, m_bTail);
81+
}
82+
else if (m_eDriverVersion == enumDriverVersion.MCD5x)
83+
{
84+
logReader = new LogMCDReader(m_sFileName, m_bTail);
85+
}
86+
Thread logThread = new Thread(new ParameterizedThreadStart(ThreadLogUpdate));
87+
logThread.Name = "LogReaderThread";
88+
logThread.Priority = ThreadPriority.Lowest;
89+
logThread.IsBackground = true;
90+
logThread.Start(logReader);
91+
while (!logThread.IsAlive) ;
92+
logThread.Join();
93+
}
94+
Thread.Sleep(100);
95+
}
96+
}
97+
98+
void ThreadLogUpdate(object logReader)
99+
{
100+
LogResult logResult;
101+
for (;;)
102+
{
103+
logResult = ((LogReader)logReader).Process();
104+
if (logResult.code == LogCode.LOG_EOF) { break; }
105+
m_fParentForm.LogUpdateHandler(logResult);
106+
}
107+
((LogReader)logReader).Close();
108+
}
109+
}
110+
}

CSMDevHelper/LogReader.cs

+37-12
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public enum LogCode: int
1616
LOG_EVENT = 1,
1717
LOG_LEG = 2,
1818
LOG_MODELING = 3,
19+
LOG_EOF = 4,
1920
};
2021

2122
public class LogResult
@@ -45,36 +46,52 @@ abstract class LogReader
4546
(?<MESSAGE>.*)";
4647

4748
protected static string logModelingPattern = @"^=+";
48-
protected bool m_isModeling;
4949
protected CSMEvent csmevent;
50-
static int readPosition = 0;
50+
public static bool s_isModeling = false;
51+
public static long s_readPosition = -1;
5152

5253
protected LogReader(string filename, bool fromBeginning)
5354
{
5455
m_fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite| FileShare.Delete);
5556
m_streamReader = new StreamReader(m_fileStream);
56-
m_isModeling = false;
57-
if (fromBeginning)
57+
s_isModeling = false;
58+
if (s_readPosition == -1)
5859
{
59-
//this.m_fileStream.Seek(0, SeekOrigin.Begin);
60-
m_streamReader.BaseStream.Seek(0, SeekOrigin.Begin);
60+
if (fromBeginning)
61+
{
62+
m_fileStream.Seek(0, SeekOrigin.Begin);
63+
s_readPosition = m_fileStream.Position;
64+
}
65+
else
66+
{
67+
m_fileStream.Seek(0, SeekOrigin.End);
68+
s_readPosition = m_fileStream.Position;
69+
}
6170
}
6271
else
6372
{
64-
//this.m_fileStream.Seek(0, SeekOrigin.End);
65-
m_streamReader.BaseStream.Seek(0, SeekOrigin.End);
73+
m_fileStream.Seek(s_readPosition, SeekOrigin.Begin);
6674
}
75+
76+
}
77+
78+
public static void reset()
79+
{
80+
s_readPosition = -1;
81+
s_isModeling = false;
6782
}
6883

6984
public void Close()
7085
{
86+
long pos = LogReader.s_readPosition;
87+
LogReader.s_readPosition = m_fileStream.Position;
88+
Console.WriteLine("Setting position from {0} to {1}", pos, LogReader.s_readPosition);
7189
m_streamReader.Close();
72-
//m_fileStream.Close();
90+
m_fileStream.Close();
7391
}
7492

7593
~LogReader() {}
7694

77-
7895
public virtual LogResult Process()
7996
{
8097
string result = String.Empty;
@@ -96,9 +113,9 @@ public virtual LogResult Process()
96113
{
97114
if (Regex.Match(result, LogReader.logModelingPattern, RegexOptions.IgnorePatternWhitespace).Success)
98115
{
99-
this.m_isModeling = !this.m_isModeling;
116+
LogReader.s_isModeling = !LogReader.s_isModeling;
100117
}
101-
if (this.m_isModeling)
118+
if (LogReader.s_isModeling)
102119
{
103120
if (csmevent != null)
104121
{
@@ -119,6 +136,10 @@ public virtual LogResult Process()
119136
}
120137
}
121138
}
139+
else if (result == null)
140+
{
141+
code = LogCode.LOG_EOF;
142+
}
122143
return new LogResult(code, result, timestamp);
123144
}
124145
}
@@ -271,6 +292,8 @@ private List<TreeNode> GenerateTree(Dictionary<string, object> jsonDict)
271292
}
272293
return currentNodes;
273294
}
295+
296+
~LogMCDReader() {}
274297
}
275298

276299

@@ -523,5 +546,7 @@ public override LogResult Process()
523546
}
524547
return logResult;
525548
}
549+
550+
~LogCPReader() {}
526551
}
527552
}

CSMDevHelper/frmCSMDH.Designer.cs

+17-20
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)