Я бы, вероятно, сделал что-то вроде этого:
public class MotionDetector
{
private IFrameGroupListener m_listener;
public MotionDetector(IFrameGroupListener listener)
{
m_listener = listener;
}
public void NewFrame(Frame f)
{
if(DetectMotion(f))
{
var group = GetCaptureGroup();
m_listener.ReceiveFrameList(group);
}
}
}
public interface IFrameGroupListener
{
void ReceiveFrameList(IList<Frame> captureGroup);
}
public class FramePump
{
private MotionDetector m_detector;
public FramePump(MotionDetector detector)
{
m_detector = detector;
}
public void DoFrame()
{
Frame f = GetFrameSomehow();
m_detector.NewFrame(f);
}
}
Я предполагаю, что DetectMotion () хранит кадр, в противном случае вам придется держать его в списке ожидания, пока не настало времяизбавиться от этого.В любом случае, FramePump получает отдельные кадры из фактического устройства / файла.Это работа.MotionDetector отвечает за обнаружение движения и передачу групп кадров с движением в них в FrameGroupListener, который затем делает все, что ему нужно.
Таким образом, классы хорошо разделены обязанностями, и очень малоделается с учетом состояния - все состояние локализовано для отдельных классов.Поскольку все вызовы являются недействительными, они могут быть отправлены в произвольные потоки, если вам нужно.
Вероятно, FramePump запускается в каком-то цикле таймера.
Я, вероятно, рассмотрю возможность прерываниятакже алгоритм группировки в отдельный класс - пусть класс motiondetector выкладывает каждый кадр вместе с булом, указывающим, было ли обнаружено движение, а затем класс MotionGrouper будет принимать их отдельно и выплевывать списки кадров в соответствии с любым алгоритмом.желательно«Обнаружение движения» и «определение того, как группировать кадры» - это, безусловно, две обязанности.Но должно быть ясно, как вы будете выполнять этот рефакторинг в этом общем виде конвейера.