Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен в гаи redacted.doc
Скачиваний:
5
Добавлен:
27.09.2019
Размер:
676.35 Кб
Скачать

2. Ccr.Итераторы.

Среда, в которой выполняется приложение в Microsoft Robotics Studio, носит название Runtime Environment. В основе Runtime лежит CLR 2.0, что дает возможность писать приложения, используя любые языки программирования платформы Microsoft .NET.

Сам по себе Runtime состоит из двух ключевых технологий: Concurrency & Coordination Runtime (CCR) – это библиотека для работы с параллельными и асинхронными потоками данных, и Decentralized System Services (DSS) – средство создания распределенных приложений на основе сервисов. Остановимся подробнее на этих технологиях.

Concurrency & Coordination Runtime Программная логика робота – в отличие от традиционных приложений – должна взаимодействовать с гораздо более непредсказуемой окружающей средой и адекватно реагировать на информацию, поступающую от множества сенсоров одновременно. Более того, по многим причинам имеет смысл существенную часть логики перенести на множество взаимодействующих друг с другом компьютеров, которые физически могут находиться как на роботе, так и вне его. В результате требуется подход, который одинаково хорошо годился бы как для параллельных, так и для распределенных приложений. Библиотека Concurrency & Coordination Runtime и была специально разработана для того, чтобы упростить создание кода для параллельного исполнения и хорошего масштабирования на современных многоядерных процессорах.

Для ответа на вопрос «зачем нужна CCR» вспомним определение понятия «приложение» в контексте Robotics Studio: это композиция слабосвязанных параллельно выполняющихся компонентов. Такой подход можно было бы реализовать с помощью существующих примитивов многопоточного программирования. Однако процесс написания многопоточных приложений – далеко не тривиальная задача, и она становится все сложнее по мере роста числа одновременно выполняемых потоков.

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

Таким образом, библиотека CCR упрощает написание программ, которые работают со многими параллельными и асинхронными потоками данных. Примерами потоков данных могут служить сенсорная информация, её обработка и управление движением в роботах.

Итераторы. Ключевое понятие для CCR – итератор, который допускает последовательное выполнение кода без блокировки выполняющегося потока, в случае если итератор ожидает получения сообщения. Когда действие должно быть выполнено, что должно занять неопределенное количество времени, итератор запоминает текущую позицию в коде, и затем отдаёт управление, до тех пор, пока не будет получено сообщение. После получения сообщения код продолжает выполнение из точки, где он был прерван.

Итераторы были представлены C# в версии 2.0, для поддержки foreach итераций, без необходимости реализации интерфейса IEnumerable. Каждый вызов итератора выполняет возвращение очередной величины в последовательности с использованием оператора yield return или завершение итерации с использованием yield break.

CCR использует итераторы, обрабатывающие последовательности задач, позволяя писать код, который выглядит похожим на последовательно выполняющийся, но в действительности представляющий собой последовательность асинхронных шагов. Итератор объявляется как метод типа IEnumerator <ITask>, что означает, что он будет взаимодействовать с задачами. Компилятор также допускает, что этот тип методов может содержать yield break и yield return утверждения, которые не могут быть использованы в обычном коде.

В случае IEnumerator <ITask> функция объявляется как перечислитель, который возвращает объекты типа <ITask>. Также могут быть созданы перечислители, которые возвращают различные типы, но задачи должны использоваться только в MRDS.