|
|
|
|
@ -0,0 +1,71 @@ |
|
|
|
|
// Author: Gockner, Simon |
|
|
|
|
// Created: 2021-04-23 |
|
|
|
|
// Copyright(c) 2021 SimonG. All Rights Reserved. |
|
|
|
|
|
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
using System.Diagnostics; |
|
|
|
|
using System.Linq; |
|
|
|
|
using System.Threading; |
|
|
|
|
using Lib.ProcessManaging.Factories; |
|
|
|
|
using Lib.ProcessManaging.Interfaces; |
|
|
|
|
|
|
|
|
|
namespace Lib.ProcessManaging |
|
|
|
|
{ |
|
|
|
|
public class ProcessManager : IProcessManager |
|
|
|
|
{ |
|
|
|
|
private readonly IObservedProcessFactory _observedProcessFactory; |
|
|
|
|
|
|
|
|
|
private Thread? _monitorThread; |
|
|
|
|
|
|
|
|
|
public ProcessManager(IObservedProcessFactory observedProcessFactory) |
|
|
|
|
{ |
|
|
|
|
_observedProcessFactory = observedProcessFactory; |
|
|
|
|
Processes = new List<IObservedProcess>(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public List<IObservedProcess> Processes { get; } |
|
|
|
|
|
|
|
|
|
public void Initialize() |
|
|
|
|
{ |
|
|
|
|
// using ManualResetEvent monitorReadyEvent = new(false); |
|
|
|
|
_monitorThread = new Thread(Monitor) |
|
|
|
|
{ |
|
|
|
|
Name = "Process Monitor", |
|
|
|
|
IsBackground = true |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
_monitorThread.Start(); |
|
|
|
|
// monitorReadyEvent.WaitOne(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void Monitor(object? state) |
|
|
|
|
{ |
|
|
|
|
// if (state is not ManualResetEvent monitorReadyEvent) |
|
|
|
|
// return; |
|
|
|
|
// |
|
|
|
|
// monitorReadyEvent.Set(); |
|
|
|
|
|
|
|
|
|
foreach (var process in Process.GetProcesses()) |
|
|
|
|
{ |
|
|
|
|
if (Processes.Any(p => p.EqualsProcess(process))) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
Processes.Add(_observedProcessFactory.Create(process)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
foreach (IObservedProcess observedProcess in Processes.ToList().Where(p => !Process.GetProcesses().Any(p.EqualsProcess))) |
|
|
|
|
{ |
|
|
|
|
Processes.Remove(observedProcess); |
|
|
|
|
observedProcess.Dispose(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Thread.Sleep(1000); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void Dispose() |
|
|
|
|
{ |
|
|
|
|
Processes.ForEach(p => p.Dispose()); |
|
|
|
|
_monitorThread = null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |