Формы GUI Видео поток сообщений - PullRequest
4 голосов
/ 23 января 2012

Я создаю пользовательский видеоплеер в форме C #. В настоящее время у плеера есть процедуры инициализации и завершения, а также поток, работающий в фоновом режиме, считывающий видеокадры и отображающий их. Я довольно новичок в C #, поэтому я пытаюсь определить, как лучше всего отправить команды start \ stop \ pause из потока GUI в поток видео. Должен ли я просто использовать переменную состояния, защищенную блокировкой, и опрашивать ее каждый раз вокруг моего видео потока; здесь любые другие рекомендации?

Спасибо.

Ответы [ 3 ]

1 голос
/ 23 января 2012

Опрошенная переменная состояния может показаться самым простым решением, если ваш видеопоток зацикливается достаточно регулярно.

Возможно, вам даже не понадобится блокировка, поэтому в C # должно быть достаточно переменной состояния volatile, обеспечивающей только один потокобновляет это.(volatile в C # имеет немного другую семантику, чем C, и должен гарантировать, что другой поток получит новое значение)

0 голосов
/ 23 января 2012

Вы должны иметь возможность вызывать / останавливать / приостанавливать график фильтра DirectShow без ограничений. Это может вызвать соответствующие вызовы методов для вашего исходного фильтра (для получения дополнительной информации см. Состояния фильтра ). Исходный фильтр должен уведомить фоновый поток об изменении состояния, если это еще не было сделано.

Синхронизация может быть реализована так же, как в классах DirectShow, где в фильтре используются два экземпляра AutoResetEvent , один для уведомления фонового потока о новом запросе и один для уведомления вызывающего потока о обработка запроса завершена.

0 голосов
/ 23 января 2012

Возможны несколько способов. Поскольку вы новичок в C # и, вероятно, тесно связаны с пользовательским интерфейсом, я предлагаю вам использовать класс BackgroundWorker.

http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

Вы можете передать свои аргументы, используя DoWorkEventArgs события DoWork. Также при таком подходе и без общих объектов (через потоки) вы можете избежать использования блокировки или синхронизации

Я думаю, что это может быть лучшим решением для вас, но есть альтернативы. Вы можете использовать модель программирования Asynchronouse (APM) или даже Thread / ThreadPool или параллельную библиотеку задач.

Должен ли я просто использовать переменную состояния, защищенную блокировкой, и опрашивать ее каждый раз вокруг моей >> видеопотока; есть ли другие рекомендации?

Если у вас есть общее состояние, как у видеопотока, вам следует использовать синхронизацию потоков. Поэтому ответом будет «да», вам следует использовать некоторую защищенную переменную, вы можете избежать блокировки, используя только volatile, но подумайте об использовании других примитивов синхронизации. Потому что использование volatile просто гарантирует, что вы читаете / записываете наиболее актуальное значение, но не мешает другим потокам читать / писать.

Некоторые ссылки, чтобы выбрать, использовать ли блокировку (другие примитивы) или просто volatile:

Нужно ли блокировать или помечать как энергозависимые при доступе к простому логическому флагу в C #?

Летучий против блокировки и против блокировки

...