|
|
|
@ -14,12 +14,15 @@ namespace Lib.ProcessManaging |
|
|
|
public class ProcessManager : IProcessManager |
|
|
|
public class ProcessManager : IProcessManager |
|
|
|
{ |
|
|
|
{ |
|
|
|
private readonly IObservedProcessFactory _observedProcessFactory; |
|
|
|
private readonly IObservedProcessFactory _observedProcessFactory; |
|
|
|
|
|
|
|
private readonly CancellationTokenSource _cancellationTokenSource; |
|
|
|
|
|
|
|
|
|
|
|
private Thread? _monitorThread; |
|
|
|
private Thread? _monitorThread; |
|
|
|
|
|
|
|
|
|
|
|
public ProcessManager(IObservedProcessFactory observedProcessFactory) |
|
|
|
public ProcessManager(IObservedProcessFactory observedProcessFactory) |
|
|
|
{ |
|
|
|
{ |
|
|
|
_observedProcessFactory = observedProcessFactory; |
|
|
|
_observedProcessFactory = observedProcessFactory; |
|
|
|
|
|
|
|
_cancellationTokenSource = new CancellationTokenSource(); |
|
|
|
|
|
|
|
|
|
|
|
Processes = new List<IObservedProcess>(); |
|
|
|
Processes = new List<IObservedProcess>(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -27,7 +30,7 @@ namespace Lib.ProcessManaging |
|
|
|
|
|
|
|
|
|
|
|
public void Initialize() |
|
|
|
public void Initialize() |
|
|
|
{ |
|
|
|
{ |
|
|
|
// using ManualResetEvent monitorReadyEvent = new(false); |
|
|
|
using ManualResetEvent monitorReadyEvent = new(false); |
|
|
|
_monitorThread = new Thread(Monitor) |
|
|
|
_monitorThread = new Thread(Monitor) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Name = "Process Monitor", |
|
|
|
Name = "Process Monitor", |
|
|
|
@ -35,16 +38,18 @@ namespace Lib.ProcessManaging |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
_monitorThread.Start(); |
|
|
|
_monitorThread.Start(); |
|
|
|
// monitorReadyEvent.WaitOne(); |
|
|
|
monitorReadyEvent.WaitOne(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void Monitor(object? state) |
|
|
|
private void Monitor(object? state) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// if (state is not ManualResetEvent monitorReadyEvent) |
|
|
|
if (state is not ManualResetEvent monitorReadyEvent) |
|
|
|
// return; |
|
|
|
return; |
|
|
|
// |
|
|
|
|
|
|
|
// monitorReadyEvent.Set(); |
|
|
|
monitorReadyEvent.Set(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (!_cancellationTokenSource.IsCancellationRequested) |
|
|
|
|
|
|
|
{ |
|
|
|
foreach (var process in Process.GetProcesses()) |
|
|
|
foreach (var process in Process.GetProcesses()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (Processes.Any(p => p.EqualsProcess(process))) |
|
|
|
if (Processes.Any(p => p.EqualsProcess(process))) |
|
|
|
@ -53,7 +58,7 @@ namespace Lib.ProcessManaging |
|
|
|
Processes.Add(_observedProcessFactory.Create(process)); |
|
|
|
Processes.Add(_observedProcessFactory.Create(process)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
foreach (IObservedProcess observedProcess in Processes.ToList().Where(p => !Process.GetProcesses().Any(p.EqualsProcess))) |
|
|
|
foreach (var observedProcess in Processes.ToList().Where(p => !Process.GetProcesses().Any(p.EqualsProcess))) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Processes.Remove(observedProcess); |
|
|
|
Processes.Remove(observedProcess); |
|
|
|
observedProcess.Dispose(); |
|
|
|
observedProcess.Dispose(); |
|
|
|
@ -61,10 +66,14 @@ namespace Lib.ProcessManaging |
|
|
|
|
|
|
|
|
|
|
|
Thread.Sleep(1000); |
|
|
|
Thread.Sleep(1000); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void Dispose() |
|
|
|
public void Dispose() |
|
|
|
{ |
|
|
|
{ |
|
|
|
Processes.ForEach(p => p.Dispose()); |
|
|
|
Processes.ForEach(p => p.Dispose()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_cancellationTokenSource.Cancel(); |
|
|
|
|
|
|
|
_cancellationTokenSource.Dispose(); |
|
|
|
_monitorThread = null; |
|
|
|
_monitorThread = null; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|