1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Process Monitor - simplified structure, moved everything to Core

This commit is contained in:
Diogo Trindade 2021-03-10 15:35:27 +00:00
parent c9ee37ece8
commit fb51e75b94
6 changed files with 35 additions and 121 deletions

View File

@ -9,13 +9,10 @@ namespace Artemis.Core.Services
{
public interface IProcessMonitorService : IArtemisService
{
void AddProcessWatcher(ProcessWatcher provider);
void RemoveProcessWatcher(ProcessWatcher provider);
IEnumerable<string> GetRunningProcesses();
event EventHandler<ProcessEventArgs> ProcessStarted;
event EventHandler<ProcessEventArgs> ProcessStopped;
IEnumerable<string> GetRunningProcesses();
}
}

View File

@ -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<ProcessWatcher> _watchers = new List<ProcessWatcher>();
private readonly ILogger _logger;
private readonly Timer _processScanTimer;
private IEnumerable<string> _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<ProcessEventArgs> ProcessStarted;
public event EventHandler<ProcessEventArgs> 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<string> 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();
}
}
}

View File

@ -1,26 +0,0 @@
using System;
using System.Collections.Generic;
namespace Artemis.Core.Services
{
/// <summary>
/// Class that provides info on running processes, including events on event start and stop
/// </summary>
public abstract class ProcessWatcher
{
public event EventHandler<ProcessEventArgs> ProcessStarted;
public event EventHandler<ProcessEventArgs> ProcessStopped;
public abstract IEnumerable<string> 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));
}
}
}

View File

@ -89,7 +89,6 @@ namespace Artemis.UI
IRegistrationService registrationService = Kernel.Get<IRegistrationService>();
registrationService.RegisterInputProvider();
registrationService.RegisterProcessWatchers();
registrationService.RegisterControllers();
// Initialize background services

View File

@ -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<string> _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<string> GetRunningProcesses()
{
return _lastScannedProcesses;
}
}
}

View File

@ -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<RemoteController>();
@ -124,7 +115,6 @@ namespace Artemis.UI.Services
void RegisterBuiltInDataModelInputs();
void RegisterBuiltInPropertyEditors();
void RegisterInputProvider();
void RegisterProcessWatchers();
void RegisterControllers();
}
}