From fb51e75b94b79e7cbbd54c27f98e8d8f8fe082c3 Mon Sep 17 00:00:00 2001 From: Diogo Trindade Date: Wed, 10 Mar 2021 15:35:27 +0000 Subject: [PATCH] Process Monitor - simplified structure, moved everything to Core --- .../Interfaces/IProcessMonitorService.cs | 7 +-- .../ProcessMonitor/ProcessMonitorService.cs | 58 ++++++++++--------- .../Services/ProcessMonitor/ProcessWatcher.cs | 26 --------- src/Artemis.UI/Bootstrapper.cs | 1 - .../ProcessWatchers/PollingProcessWatcher.cs | 52 ----------------- .../Services/RegistrationService.cs | 12 +--- 6 files changed, 35 insertions(+), 121 deletions(-) delete mode 100644 src/Artemis.Core/Services/ProcessMonitor/ProcessWatcher.cs delete mode 100644 src/Artemis.UI/ProcessWatchers/PollingProcessWatcher.cs diff --git a/src/Artemis.Core/Services/ProcessMonitor/Interfaces/IProcessMonitorService.cs b/src/Artemis.Core/Services/ProcessMonitor/Interfaces/IProcessMonitorService.cs index c1873de68..907af1607 100644 --- a/src/Artemis.Core/Services/ProcessMonitor/Interfaces/IProcessMonitorService.cs +++ b/src/Artemis.Core/Services/ProcessMonitor/Interfaces/IProcessMonitorService.cs @@ -9,13 +9,10 @@ namespace Artemis.Core.Services { public interface IProcessMonitorService : IArtemisService { - void AddProcessWatcher(ProcessWatcher provider); - void RemoveProcessWatcher(ProcessWatcher provider); - - IEnumerable GetRunningProcesses(); - event EventHandler ProcessStarted; event EventHandler ProcessStopped; + + IEnumerable GetRunningProcesses(); } } diff --git a/src/Artemis.Core/Services/ProcessMonitor/ProcessMonitorService.cs b/src/Artemis.Core/Services/ProcessMonitor/ProcessMonitorService.cs index 65df1ae65..3b3eefc55 100644 --- a/src/Artemis.Core/Services/ProcessMonitor/ProcessMonitorService.cs +++ b/src/Artemis.Core/Services/ProcessMonitor/ProcessMonitorService.cs @@ -1,46 +1,52 @@ -using System; +using Serilog; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Timers; namespace Artemis.Core.Services { public class ProcessMonitorService : IProcessMonitorService { - private readonly List _watchers = new List(); + private readonly ILogger _logger; + private readonly Timer _processScanTimer; + private IEnumerable _lastScannedProcesses; + + public ProcessMonitorService(ILogger logger) + { + _logger = logger; + _lastScannedProcesses = Process.GetProcesses().Select(p => p.ProcessName).Distinct().ToArray(); + _processScanTimer = new Timer(1000); + _processScanTimer.Elapsed += OnTimerElapsed; + _processScanTimer.Start(); + } + public event EventHandler ProcessStarted; + public event EventHandler ProcessStopped; - public void AddProcessWatcher(ProcessWatcher watcher) - { - watcher.ProcessStarted += ProviderOnProcessStarted; - watcher.ProcessStopped += ProviderOnProcessStopped; - _watchers.Add(watcher); - } - - public void RemoveProcessWatcher(ProcessWatcher watcher) - { - if (!_watchers.Contains(watcher)) - return; - - _watchers.Remove(watcher); - watcher.ProcessStarted -= ProviderOnProcessStarted; - watcher.ProcessStopped -= ProviderOnProcessStopped; - } - public IEnumerable GetRunningProcesses() { - return _watchers.SelectMany(w => w.GetRunningProcesses()); + return _lastScannedProcesses; } - private void ProviderOnProcessStopped(object? sender, ProcessEventArgs e) + private void OnTimerElapsed(object sender, ElapsedEventArgs e) { - ProcessStopped?.Invoke(this, e); - } + var newProcesses = Process.GetProcesses().Select(p => p.ProcessName).Distinct(); + foreach (var startedProcess in newProcesses.Except(_lastScannedProcesses)) + { + ProcessStarted?.Invoke(this, new ProcessEventArgs(startedProcess)); + _logger.Verbose("Started Process: {startedProcess}", startedProcess); + } - private void ProviderOnProcessStarted(object? sender, ProcessEventArgs e) - { - ProcessStarted?.Invoke(this, e); + foreach (var stoppedProcess in _lastScannedProcesses.Except(newProcesses)) + { + ProcessStopped?.Invoke(this, new ProcessEventArgs(stoppedProcess)); + _logger.Verbose("Stopped Process: {stoppedProcess}", stoppedProcess); + } + + _lastScannedProcesses = newProcesses.ToArray(); } } } diff --git a/src/Artemis.Core/Services/ProcessMonitor/ProcessWatcher.cs b/src/Artemis.Core/Services/ProcessMonitor/ProcessWatcher.cs deleted file mode 100644 index 7bede154a..000000000 --- a/src/Artemis.Core/Services/ProcessMonitor/ProcessWatcher.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Artemis.Core.Services -{ - /// - /// Class that provides info on running processes, including events on event start and stop - /// - public abstract class ProcessWatcher - { - public event EventHandler ProcessStarted; - public event EventHandler ProcessStopped; - - public abstract IEnumerable GetRunningProcesses(); - - public virtual void OnProcessStarted(string processName) - { - ProcessStarted?.Invoke(this, new ProcessEventArgs(processName)); - } - - public virtual void OnProcessStopped(string processName) - { - ProcessStopped?.Invoke(this, new ProcessEventArgs(processName)); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI/Bootstrapper.cs b/src/Artemis.UI/Bootstrapper.cs index b540db62c..585b1b1a4 100644 --- a/src/Artemis.UI/Bootstrapper.cs +++ b/src/Artemis.UI/Bootstrapper.cs @@ -89,7 +89,6 @@ namespace Artemis.UI IRegistrationService registrationService = Kernel.Get(); registrationService.RegisterInputProvider(); - registrationService.RegisterProcessWatchers(); registrationService.RegisterControllers(); // Initialize background services diff --git a/src/Artemis.UI/ProcessWatchers/PollingProcessWatcher.cs b/src/Artemis.UI/ProcessWatchers/PollingProcessWatcher.cs deleted file mode 100644 index 20a4e807a..000000000 --- a/src/Artemis.UI/ProcessWatchers/PollingProcessWatcher.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Artemis.Core.Services; -using Serilog; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Management; -using System.Text; -using System.Threading.Tasks; -using System.Timers; - -namespace Artemis.UI.ProcessWatchers -{ - public class PollingProcessWatcher : ProcessWatcher - { - private readonly ILogger _logger; - private readonly Timer _processScanTimer; - private IEnumerable _lastScannedProcesses; - - public PollingProcessWatcher(ILogger logger) - { - _logger = logger; - _lastScannedProcesses = Process.GetProcesses().Select(p => p.ProcessName).Distinct().ToArray(); - _processScanTimer = new Timer(100); - _processScanTimer.Elapsed += OnTimerElapsed; - _processScanTimer.Start(); - } - - private void OnTimerElapsed(object sender, ElapsedEventArgs e) - { - var newProcesses = Process.GetProcesses().Select(p => p.ProcessName).Distinct(); - foreach (var startedProcess in newProcesses.Except(_lastScannedProcesses)) - { - OnProcessStarted(startedProcess); - _logger.Information($"Started Process!: {startedProcess}"); - } - - foreach (var stoppedProcess in _lastScannedProcesses.Except(newProcesses)) - { - OnProcessStopped(stoppedProcess); - _logger.Information($"Stopped Process!: {stoppedProcess}"); - } - - _lastScannedProcesses = newProcesses.ToArray(); - } - - public override IEnumerable GetRunningProcesses() - { - return _lastScannedProcesses; - } - } -} diff --git a/src/Artemis.UI/Services/RegistrationService.cs b/src/Artemis.UI/Services/RegistrationService.cs index b8a1e8b86..0d51ce376 100644 --- a/src/Artemis.UI/Services/RegistrationService.cs +++ b/src/Artemis.UI/Services/RegistrationService.cs @@ -7,7 +7,6 @@ using Artemis.UI.DefaultTypes.DataModel.Input; using Artemis.UI.DefaultTypes.PropertyInput; using Artemis.UI.InputProviders; using Artemis.UI.Ninject; -using Artemis.UI.ProcessWatchers; using Artemis.UI.Shared.Services; using Serilog; @@ -21,7 +20,6 @@ namespace Artemis.UI.Services private readonly IPluginManagementService _pluginManagementService; private readonly IInputService _inputService; private readonly IWebServerService _webServerService; - private readonly IProcessMonitorService _processMonitorService; private bool _registeredBuiltInDataModelDisplays; private bool _registeredBuiltInDataModelInputs; private bool _registeredBuiltInPropertyEditors; @@ -31,8 +29,7 @@ namespace Artemis.UI.Services IProfileEditorService profileEditorService, IPluginManagementService pluginManagementService, IInputService inputService, - IWebServerService webServerService, - IProcessMonitorService processMonitorService) + IWebServerService webServerService) { _logger = logger; _dataModelUIService = dataModelUIService; @@ -40,7 +37,6 @@ namespace Artemis.UI.Services _pluginManagementService = pluginManagementService; _inputService = inputService; _webServerService = webServerService; - _processMonitorService = processMonitorService; LoadPluginModules(); pluginManagementService.PluginEnabling += PluginServiceOnPluginEnabling; @@ -96,11 +92,6 @@ namespace Artemis.UI.Services _inputService.AddInputProvider(new NativeWindowInputProvider(_logger, _inputService)); } - public void RegisterProcessWatchers() - { - _processMonitorService.AddProcessWatcher(new PollingProcessWatcher(_logger)); - } - public void RegisterControllers() { _webServerService.AddController(); @@ -124,7 +115,6 @@ namespace Artemis.UI.Services void RegisterBuiltInDataModelInputs(); void RegisterBuiltInPropertyEditors(); void RegisterInputProvider(); - void RegisterProcessWatchers(); void RegisterControllers(); } } \ No newline at end of file