Cross Platform Application to allow control with a MIDI controller
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.8 KiB

// Author: Gockner, Simon
// Created: 2021-04-23
// Copyright(c) 2021 SimonG. All Rights Reserved.
using System;
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 readonly CancellationTokenSource _cancellationTokenSource;
private Thread? _monitorThread;
public ProcessManager(IObservedProcessFactory observedProcessFactory)
{
_observedProcessFactory = observedProcessFactory;
_cancellationTokenSource = new CancellationTokenSource();
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);
monitorReadyEvent.WaitOne();
}
private void Monitor(object? state)
{
if (state is not ManualResetEvent monitorReadyEvent)
return;
monitorReadyEvent.Set();
while (!_cancellationTokenSource.IsCancellationRequested)
{
foreach (var process in Process.GetProcesses())
{
if (Processes.Any(p => p.EqualsProcess(process)))
continue;
IObservedProcess observedProcess = _observedProcessFactory.Create(process);
Processes.Add(observedProcess);
ProcessStarted?.Invoke(this, observedProcess);
}
foreach (var observedProcess in Processes.ToList().Where(p => !Process.GetProcesses().Any(p.EqualsProcess)))
{
Processes.Remove(observedProcess);
ProcessExited?.Invoke(this, observedProcess); //TestMe: is the passed process still usable? (disposed directly afterwards)
observedProcess.Dispose();
}
Thread.Sleep(1000);
}
}
public event EventHandler<IObservedProcess>? ProcessStarted;
public event EventHandler<IObservedProcess>? ProcessExited;
public void Dispose()
{
Processes.ForEach(p => p.Dispose());
_cancellationTokenSource.Cancel();
_cancellationTokenSource.Dispose();
_monitorThread = null;
}
}
}