Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > ISergey

Оценить эту запись

О контролеррах, состояниях и пользе событий в асинхронных задачах

Запись от ISergey размещена 29.11.2012 в 01:46

Описательно/вводная часть предназначается скорее начинающим, вопросительная к более опытным (собственно, а к кому же еще))
Сейчас пишу плеер для потокового видео с прикрученным доп. функционалом. Понятно, что сама по себе задача показать видео не стоит заморочек, но вот доп. функционал… вообщем проект растет и дописать в нем еще есть что.
А написать, и заодно спросить здесь, хотел про организацию сценариев поведения.
С пылу, с жару в основу реализации плеера легли состояния. Состояние «видео играет», «видео на паузе» и пр. К примеру, клик пользователя по кнопке «pause» -> переход в состояние /*капитан очевидность*/ - «видео на паузе». Можно обработать таким вот способом
Код AS1/AS2:
VideoStream.pause();
NavigationPanel. ShowPlaybutton();
…
Ну или для play
Код AS1/AS2:
VideoStream.play();
NavigationPanel. ShowPauseButton();
Работает гуд, пока, к примеру, работаем с локальными данными, или сервер отвечает быстро.
А вот что происходит, когда он (сервер) задумается что ему с этим делать достаточно долго, так чтобы пользователь успел понажимать play/pause.
Как уже все поняли, получается бардак: сервер думает одно, на экран рисуем совсем другое.
Кому то решение проблемы придет только от фразы «показать видео», кому то не придет) мне мысль об асинхронном мышлении(простите за тавтологию)) в работе с потоковым видео пришла с появлением этого самого бардака.
Благо решение проблемы нашлось сразу: мыслим объектно, делим задачу как минимум на две, получаем следующий мини сценарий.
1. ловим клик пользователя; сообщаем серверу.
2. ловим сообщение сервера о том, что видео поставлено на паузу; отрисовываем замену кнопки.
Ну или кодом
Код AS1/AS2:
MainVideoModule[NavigationPanelEvents.CLICK_PLAY]	= Delegate.create(MainVideoModule, MainVideoModule.play);		
MainVideoModule[NavigationPanelEvents.CLICK_PAUSE]	= Delegate.create(MainVideoModule, MainVideoModule.pause);	
NavigationPanel[VideoEvents.VIDEOSTATE] 	= Delegate.create(NavigationPanel, NavigationPanel.setPlayState);
Здесь MainVideoModule - модуль главного видео (есть и другие потоки, к примеру, для функции "картинка в картинке")
Отсюда расширю идею дальше, до моего видения работы контролеров.
На контролер возлагается инициализация всех подконтрольных ему модулей, прописывание связей между ними. В данном примере общение видео модуля с информационной панелькой навигации.
Какие вижу плюсы:
в первую очередь реализована «слабая связанность». Модули живут своей жизнью, добавление нового не привносит ничего нового. К примеру, возможность нажать паузу с того же пульта телевизора (оговорюсь, одна из платформ плеера SmartTV) вносит минимум изменений в проект: добавили модуль отвечающий за пользовательский интерфейс ( UI ), легко пристыковали его в работу.
В код контролера плюс строка
MainVideoModule[UIEvents.SET_PLAY] = Delegate.create(MainVideoModule, MainVideoModule.play);
механизм упрощает не только добавление новых, но и "выстегивание" временно не нужных модулей - достаточно закомментировать одну строку инициализации модуля.

Ну это о плюсах, а вот теперь о минусах и вопросах к опытным))
Как уже говорил, проект растет. Теперь таких вот «плюс строка» в главном контролере набралось около двух сотен. Дабы не запутаться, что подключил, что нет, стал организовывать код сценариями поведения, к примеру, сценарий логина к серверу в упрошенном виде
Step.1. клик по кнопке логин, показываем поля для ввода, блокируем прочие модули
Step.2. отправляем на сервер пару логин/пароль
Step.3. получили ответ, смотрим результат, при косяке повторить
Step.4. делаем выводы, скрываем окно авторизации, открываем скрытые панели
Достаточно короткий сценарий, всего четыре пункта, некоторые по 10 и по 15.

Что смущает сейчас: обилие записей, что увеличивает вероятность ошибки не связать кого либо.
Чего хотелось бы: большей компактности, может быть, реализацию сценариев через монады.
Ну к примеру, записей подобного рода
Код AS1/AS2:
login(show_login_window, hide_other_objects, send_authorization, authorization_result, make_ conclusion, other_logic);
Вообщем кто сталкивался, прошу указать вектор.
Чуть не забыл, отдельное БОЛЬШОЕ спасибо iNils за делегат.
Всего комментариев 4

Комментарии

Старый 29.11.2012 01:53 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
вообщем проект растет и дописать в нем еще есть что.
Ну почему ас2?
2013 год на носу!
Старый 29.11.2012 01:59 ISergey вне форума
ISergey
Цитата:
Ну почему ас2?
согласен на 100%. осталось только донести эту мысль до Samsung, дабы они реализовали поддержку выше 8-го плеера на модельном ряду телевизоров 2010-2011 года. Приходиться ориенироваться и на такие.
Старый 29.11.2012 02:05 Котяра вне форума
Котяра
 
Аватар для Котяра
А, вот оно что..
Ну тогда вам может пригодиться вот это
Старый 03.12.2012 18:52 ISergey вне форума
ISergey
Спасибо, поприменяем.
 

 


Часовой пояс GMT +4, время: 01:57.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.