- continue implementing process managing

master
Simon G 5 years ago
parent a3a3619cbb
commit c8e8bfb078
  1. 14
      Lib.ProcessManaging/Factories/IObservedProcessFactory.cs
  2. 10
      Lib.ProcessManaging/Interfaces/IObservedProcess.cs
  3. 8
      Lib.ProcessManaging/Interfaces/IProcessManager.cs
  4. 24
      Lib.ProcessManaging/ObservedProcess.cs
  5. 71
      Lib.ProcessManaging/ProcessManager.cs
  6. 9
      Mystify/App.axaml.cs
  7. 3
      Mystify/Bootstrapper.cs
  8. 25
      Mystify/Installers/ProcessManagingInstaller.cs
  9. 1
      Mystify/Mystify.csproj

@ -0,0 +1,14 @@
// Author: Gockner, Simon
// Created: 2021-04-23
// Copyright(c) 2021 SimonG. All Rights Reserved.
using System.Diagnostics;
using Lib.ProcessManaging.Interfaces;
namespace Lib.ProcessManaging.Factories
{
public interface IObservedProcessFactory
{
IObservedProcess Create(Process process);
}
}

@ -2,10 +2,16 @@
// Created: 2021-04-16
// Copyright(c) 2021 SimonG. All Rights Reserved.
using System;
using System.Diagnostics;
namespace Lib.ProcessManaging.Interfaces
{
public interface IObservedProcess
public interface IObservedProcess : IDisposable
{
string Name { get; }
int Id { get; }
bool EqualsProcess(Process process);
}
}

@ -2,15 +2,15 @@
// Created: 2021-04-16
// Copyright(c) 2021 SimonG. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Lib.ProcessManaging.Interfaces
{
public interface IProcessManager
public interface IProcessManager : IDisposable
{
List<IObservedProcess> Processes { get; }
List<IObservedProcess>? Processes { get; }
Task Initialize();
void Initialize();
}
}

@ -0,0 +1,24 @@
// Author: Gockner, Simon
// Created: 2021-04-23
// Copyright(c) 2021 SimonG. All Rights Reserved.
using System;
using System.Diagnostics;
using Lib.ProcessManaging.Interfaces;
namespace Lib.ProcessManaging
{
public class ObservedProcess : IObservedProcess
{
private readonly Process _process;
public ObservedProcess(Process process) => _process = process;
public string Name => _process.ProcessName;
public int Id => _process.Id;
public bool EqualsProcess(Process process) => _process.Id == process.Id;
public void Dispose() => _process.Dispose();
}
}

@ -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;
}
}
}

@ -12,6 +12,7 @@ using Lib.Logging.Interfaces;
using Lib.Logging.Loggers.Factories;
using Lib.Logging.Loggers.Interfaces;
using Lib.NotifyIcon;
using Lib.ProcessManaging.Interfaces;
using LightweightIocContainer.Interfaces;
using Mystify.ViewModels;
using Mystify.Views;
@ -25,6 +26,8 @@ namespace Mystify
private ILog? _log;
private ILoggerInitializer? _loggerInitializer;
private IProcessManager? _processManager;
private INotifyIcon? _notifyIcon;
@ -50,6 +53,9 @@ namespace Mystify
await _log.WriteLogHeader<App>();
_processManager = _kernel.Resolve<IProcessManager>();
_processManager.Initialize();
_mainModel = _kernel.Resolve<MainModel>();
_mainWindow = new MainWindow();
_mainWindowViewModel = new MainWindowViewModel(_mainModel, _mainWindow);
@ -92,7 +98,8 @@ namespace Mystify
_mainWindow?.Close();
_mainModel?.Dispose();
_notifyIcon?.Remove();
_processManager?.Dispose();
if (_log != null)
await _log.DisposeAsync();

@ -17,6 +17,7 @@ namespace Mystify
new DriverInstaller(),
new LoggingInstaller(),
new MidiInstaller(),
new NotifyIconInstaller());
new NotifyIconInstaller(),
new ProcessManagingInstaller());
}
}

@ -0,0 +1,25 @@
// Author: Gockner, Simon
// Created: 2021-04-23
// Copyright(c) 2021 SimonG. All Rights Reserved.
using Lib.ProcessManaging;
using Lib.ProcessManaging.Factories;
using Lib.ProcessManaging.Interfaces;
using LightweightIocContainer;
using LightweightIocContainer.Interfaces;
using LightweightIocContainer.Interfaces.Installers;
namespace Mystify.Installers
{
public class ProcessManagingInstaller : IIocInstaller
{
public void Install(IIocContainer container)
{
container.Register<IProcessManager, ProcessManager>(Lifestyle.Singleton);
container.Register<IObservedProcess, ObservedProcess>();
//factories
container.RegisterFactory<IObservedProcessFactory>();
}
}
}

@ -22,6 +22,7 @@
<ProjectReference Include="..\Lib.Logging\Lib.Logging.csproj" />
<ProjectReference Include="..\Lib.Midi\Lib.Midi.csproj" />
<ProjectReference Include="..\Lib.NotifyIcon\Lib.NotifyIcon.csproj" />
<ProjectReference Include="..\Lib.ProcessManaging\Lib.ProcessManaging.csproj" />
<ProjectReference Include="..\Lib.Tools\Lib.Tools.csproj" />
</ItemGroup>
</Project>

Loading…
Cancel
Save