Skip to content

Commit c2b4f57

Browse files
committed
* This needs to be optimized
1 parent e96a645 commit c2b4f57

File tree

6 files changed

+142
-6
lines changed

6 files changed

+142
-6
lines changed

MemPlus/Classes/RAM/RamAnalyzer.cs

Lines changed: 108 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,118 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
3+
using System.Diagnostics;
54
using System.Threading.Tasks;
5+
using System.Timers;
6+
using MemPlus.Classes.RAM.ViewModels;
67

78
namespace MemPlus.Classes.RAM
89
{
9-
class RamAnalyzer
10+
internal sealed class RamAnalyzer
1011
{
12+
private readonly List<ProcessData> _processDataList;
1113

14+
internal delegate void ProcessAddedEvent(ProcessData processData);
15+
internal delegate void ProcessRemovedEvent(ProcessData processData);
16+
17+
private readonly ProcessAddedEvent _processAddedEvent;
18+
private readonly ProcessRemovedEvent _processRemovedEvent;
19+
20+
internal RamAnalyzer(int delay, ProcessAddedEvent processAddedEvent, ProcessRemovedEvent processRemovedEvent)
21+
{
22+
_processAddedEvent = processAddedEvent;
23+
_processRemovedEvent = processRemovedEvent;
24+
25+
_processDataList = new List<ProcessData>();
26+
Timer updateTimer = new Timer
27+
{
28+
Interval = delay,
29+
Enabled = true
30+
};
31+
32+
updateTimer.Elapsed += UpdateTimerOnElapsed;
33+
UpdateTimerOnElapsed(null, null);
34+
}
35+
36+
private async void UpdateTimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
37+
{
38+
List<string> currentPaths = new List<string>();
39+
await Task.Run(async () =>
40+
{
41+
foreach (Process p in Process.GetProcesses())
42+
{
43+
try
44+
{
45+
currentPaths.Add(p.MainModule.FileName);
46+
47+
ProcessData processData = EqualsPath(p.MainModule.FileName);
48+
bool addProcessData = false;
49+
if (processData == null)
50+
{
51+
processData = new ProcessData();
52+
addProcessData = true;
53+
}
54+
55+
processData.ProcessName = p.ProcessName;
56+
processData.ProcessLocation = p.MainModule.FileName;
57+
processData.Pid = p.Id;
58+
processData.WorkingSet = (p.WorkingSet64 / 1024 / 1024).ToString("F2") + " MB";
59+
60+
if (addProcessData)
61+
{
62+
_processDataList.Add(processData);
63+
_processAddedEvent.Invoke(processData);
64+
}
65+
}
66+
catch (Exception ex)
67+
{
68+
69+
}
70+
}
71+
await CleanProcessList(currentPaths);
72+
});
73+
}
74+
75+
private async Task CleanProcessList(IReadOnlyCollection<string> currentPaths)
76+
{
77+
await Task.Run(() =>
78+
{
79+
for (int i = _processDataList.Count - 1; i >= 0; i--)
80+
{
81+
bool remove = true;
82+
83+
foreach (string s in currentPaths)
84+
{
85+
if (_processDataList[i].ProcessLocation == s)
86+
{
87+
remove = false;
88+
break;
89+
}
90+
}
91+
92+
if (remove)
93+
{
94+
_processRemovedEvent.Invoke(_processDataList[i]);
95+
_processDataList.RemoveAt(i);
96+
}
97+
}
98+
});
99+
}
100+
101+
private ProcessData EqualsPath(string path)
102+
{
103+
foreach (ProcessData pd in _processDataList)
104+
{
105+
if (pd.ProcessLocation == path)
106+
{
107+
return pd;
108+
}
109+
}
110+
return null;
111+
}
112+
113+
internal List<ProcessData> GetProcessData()
114+
{
115+
return _processDataList;
116+
}
12117
}
13118
}

MemPlus/Classes/RAM/RamController.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,6 @@ await Task.Run(async () =>
281281
RamSavings = oldUsage - newUsage;
282282
});
283283

284-
285284
_logController.AddLog(new ApplicationLog("Done clearing RAM memory"));
286285
}
287286

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace MemPlus.Classes.RAM.ViewModels
2+
{
3+
internal sealed class ProcessData
4+
{
5+
public string ProcessName { get; set; }
6+
public string ProcessLocation { get; set; }
7+
public string WorkingSet { get; set; }
8+
public int Pid { get; set; }
9+
}
10+
}

MemPlus/MemPlus.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
<SubType>Designer</SubType>
7272
</ApplicationDefinition>
7373
<Compile Include="Classes\RAM\RamAnalyzer.cs" />
74+
<Compile Include="Classes\RAM\ViewModels\ProcessData.cs" />
7475
<Compile Include="Windows\AnalyzerWindow.xaml.cs">
7576
<DependentUpon>AnalyzerWindow.xaml</DependentUpon>
7677
</Compile>

MemPlus/Windows/AnalyzerWindow.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
<ListView.View>
2121
<GridView x:Name="DynGrid">
2222
<GridViewColumn Header="Process" DisplayMemberBinding="{Binding ProcessName}" />
23-
<GridViewColumn Header="PID" DisplayMemberBinding="{Binding Id}" />
24-
<GridViewColumn Header="RAM usage" DisplayMemberBinding="{Binding WorkingSet64}" />
23+
<GridViewColumn Header="PID" DisplayMemberBinding="{Binding Pid}" />
24+
<GridViewColumn Header="RAM usage" DisplayMemberBinding="{Binding WorkingSet}" />
2525
</GridView>
2626
</ListView.View>
2727
</ListView>

MemPlus/Windows/AnalyzerWindow.xaml.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using System.Windows;
33
using MemPlus.Classes.GUI;
44
using MemPlus.Classes.LOG;
5+
using MemPlus.Classes.RAM;
6+
using MemPlus.Classes.RAM.ViewModels;
57

68
namespace MemPlus.Windows
79
{
@@ -22,13 +24,32 @@ public AnalyzerWindow(LogController logController)
2224
{
2325
_logController = logController;
2426
_logController.AddLog(new ApplicationLog("Initializing AnalyzerWindow"));
27+
2528
InitializeComponent();
2629
ChangeVisualStyle();
2730
LoadProperties();
2831

32+
new RamAnalyzer(5000, ProcessListUpdatedEvent, ProcessRemovedEvent);
33+
2934
_logController.AddLog(new ApplicationLog("Done initializing AnalyzerWindow"));
3035
}
3136

37+
private void ProcessRemovedEvent(ProcessData processData)
38+
{
39+
Dispatcher.Invoke(() =>
40+
{
41+
LsvProcesses.Items.Remove(processData);
42+
});
43+
}
44+
45+
private void ProcessListUpdatedEvent(ProcessData processData)
46+
{
47+
Dispatcher.Invoke(() =>
48+
{
49+
LsvProcesses.Items.Add(processData);
50+
});
51+
}
52+
3253
/// <summary>
3354
/// Change the visual style of the controls, depending on the settings.
3455
/// </summary>

0 commit comments

Comments
 (0)