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 public interface IProcessMonitorService : IArtemisService
{ {
void AddProcessWatcher(ProcessWatcher provider);
void RemoveProcessWatcher(ProcessWatcher provider);
IEnumerable<string> GetRunningProcesses();
event EventHandler<ProcessEventArgs> ProcessStarted; event EventHandler<ProcessEventArgs> ProcessStarted;
event EventHandler<ProcessEventArgs> ProcessStopped; 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.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Timers;
namespace Artemis.Core.Services namespace Artemis.Core.Services
{ {
public class ProcessMonitorService : IProcessMonitorService 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> ProcessStarted;
public event EventHandler<ProcessEventArgs> ProcessStopped; 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() 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) foreach (var stoppedProcess in _lastScannedProcesses.Except(newProcesses))
{ {
ProcessStarted?.Invoke(this, e); 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>(); IRegistrationService registrationService = Kernel.Get<IRegistrationService>();
registrationService.RegisterInputProvider(); registrationService.RegisterInputProvider();
registrationService.RegisterProcessWatchers();
registrationService.RegisterControllers(); registrationService.RegisterControllers();
// Initialize background services // 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.DefaultTypes.PropertyInput;
using Artemis.UI.InputProviders; using Artemis.UI.InputProviders;
using Artemis.UI.Ninject; using Artemis.UI.Ninject;
using Artemis.UI.ProcessWatchers;
using Artemis.UI.Shared.Services; using Artemis.UI.Shared.Services;
using Serilog; using Serilog;
@ -21,7 +20,6 @@ namespace Artemis.UI.Services
private readonly IPluginManagementService _pluginManagementService; private readonly IPluginManagementService _pluginManagementService;
private readonly IInputService _inputService; private readonly IInputService _inputService;
private readonly IWebServerService _webServerService; private readonly IWebServerService _webServerService;
private readonly IProcessMonitorService _processMonitorService;
private bool _registeredBuiltInDataModelDisplays; private bool _registeredBuiltInDataModelDisplays;
private bool _registeredBuiltInDataModelInputs; private bool _registeredBuiltInDataModelInputs;
private bool _registeredBuiltInPropertyEditors; private bool _registeredBuiltInPropertyEditors;
@ -31,8 +29,7 @@ namespace Artemis.UI.Services
IProfileEditorService profileEditorService, IProfileEditorService profileEditorService,
IPluginManagementService pluginManagementService, IPluginManagementService pluginManagementService,
IInputService inputService, IInputService inputService,
IWebServerService webServerService, IWebServerService webServerService)
IProcessMonitorService processMonitorService)
{ {
_logger = logger; _logger = logger;
_dataModelUIService = dataModelUIService; _dataModelUIService = dataModelUIService;
@ -40,7 +37,6 @@ namespace Artemis.UI.Services
_pluginManagementService = pluginManagementService; _pluginManagementService = pluginManagementService;
_inputService = inputService; _inputService = inputService;
_webServerService = webServerService; _webServerService = webServerService;
_processMonitorService = processMonitorService;
LoadPluginModules(); LoadPluginModules();
pluginManagementService.PluginEnabling += PluginServiceOnPluginEnabling; pluginManagementService.PluginEnabling += PluginServiceOnPluginEnabling;
@ -96,11 +92,6 @@ namespace Artemis.UI.Services
_inputService.AddInputProvider(new NativeWindowInputProvider(_logger, _inputService)); _inputService.AddInputProvider(new NativeWindowInputProvider(_logger, _inputService));
} }
public void RegisterProcessWatchers()
{
_processMonitorService.AddProcessWatcher(new PollingProcessWatcher(_logger));
}
public void RegisterControllers() public void RegisterControllers()
{ {
_webServerService.AddController<RemoteController>(); _webServerService.AddController<RemoteController>();
@ -124,7 +115,6 @@ namespace Artemis.UI.Services
void RegisterBuiltInDataModelInputs(); void RegisterBuiltInDataModelInputs();
void RegisterBuiltInPropertyEditors(); void RegisterBuiltInPropertyEditors();
void RegisterInputProvider(); void RegisterInputProvider();
void RegisterProcessWatchers();
void RegisterControllers(); void RegisterControllers();
} }
} }