Класс source_block

Класс source_block — это абстрактный базовый класс только для блоков источника. Класс предоставляет основные функции управления соединениями, а также проверки распространенных ошибок.

Синтаксис

template<class _TargetLinkRegistry, class _MessageProcessorType = ordered_message_processor<typename _TargetLinkRegistry::type::type>>
class source_block : public ISource<typename _TargetLinkRegistry::type::type>;

Параметры

_TargetLinkRegistry
Реестр ссылок, используемый для хранения целевых ссылок.

_MessageProcessorType
Тип процессора для обработки сообщений.

Участники

Общедоступные определения типов

Имя Описание
target_iterator Итератор для обхода подключенных целевых объектов.

Открытые конструкторы

Имя Описание
source_block Формирует объект source_block.
Деструктор ~source_block Уничтожает source_block объект.

Открытые методы

Имя Описание
Принять Принимает сообщение, которое было предложено этим source_block объектом, передавая владение вызывающему объекту.
acquire_ref Получает количество ссылок для этого source_block объекта, чтобы предотвратить удаление.
consume Использует сообщение, ранее предлагаемое этим source_block объектом, и успешно зарезервировано целевым объектом, передавая владельца вызывающему объекту.
link_target Связывает целевой блок с этим source_block объектом.
release Освобождает предыдущее успешное резервирование сообщений.
release_ref Освобождает количество ссылок для этого source_block объекта.
reserve Резервирует сообщение, ранее предлагаемое этим source_block объектом.
unlink_target Отменяет связь целевого блока из этого source_block объекта.
unlink_targets Отменяет связь всех целевых блоков из этого source_block объекта. (Переопределения ISource::unlink_targets.)

Защищенные методы

Имя Описание
accept_message При переопределении в производном классе принимает предлагаемое сообщение источником. Блоки сообщений должны переопределить этот метод, чтобы проверить _MsgId и вернуть сообщение.
async_send Асинхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано.
consume_message При переопределении в производном классе использует сообщение, ранее зарезервированное.
enable_batched_processing Активирует пакетную обработку для этого блока.
initialize_source Инициализирует message_propagator внутри этого source_block.
link_target_notification Обратный вызов, уведомляющий о том, что новый целевой объект связан с этим source_block объектом.
process_input_messages Обработка входных сообщений. Подходит только для блоков распространения, производных от source_block.
propagate_output_messages Распространение сообщений в целевые объекты.
propagate_to_any_targets При переопределении в производном классе распространяет данное сообщение на любые или все связанные целевые объекты. Это основная подпрограмма распространения для блоков сообщений.
release_message При переопределении в производном классе освобождает предыдущее резервирование сообщений.
remove_targets Удаляет все целевые ссылки для этого исходного блока. Это должно вызываться из деструктора.
reserve_message При переопределении в производном классе резервирует сообщение, ранее предлагаемое этим source_block объектом.
resume_propagation При переопределении в производном классе возобновляется распространение после освобождения резервирования.
sync_send Синхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано.
unlink_target_notification Обратный вызов, уведомляющий о том, что целевой объект не связывали с этим source_block объектом.
wait_for_outstanding_async_sends Ожидает завершения всех асинхронных распространений. Это ожидание спина, зависящее от распространения, используется в деструкторах блоков сообщений, чтобы убедиться, что все асинхронные распространения имеют время завершения перед уничтожением блока.

Замечания

Блоки сообщений должны быть производными от этого блока, чтобы воспользоваться преимуществами управления ссылками и синхронизации, предоставляемых этим классом.

Иерархия наследования

ISource

source_block

Требования

Заголовок: agents.h

Пространство имен: concurrency

accept

Принимает сообщение, которое было предложено этим source_block объектом, передавая владение вызывающему объекту.

virtual message<_Target_type>* accept(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<_Target_type>* _PTarget);

Параметры

_MsgId
Предлагаемый runtime_object_identitymessage объект.

_PTarget
Указатель на целевой блок, вызывающий accept метод.

Возвращаемое значение

Указатель на объект, на который вызывающий message объект теперь имеет право владения.

Замечания

Метод создает исключение invalid_argument , если параметр _PTarget имеет значение NULL.

Метод accept вызывается целевым объектом во время предложения сообщения этим ISource блоком. Возвращаемый указатель сообщения может отличаться от propagate переданного в метод ITarget блока, если этот источник решит сделать копию сообщения.

accept_message

При переопределении в производном классе принимает предлагаемое сообщение источником. Блоки сообщений должны переопределить этот метод, чтобы проверить _MsgId и вернуть сообщение.

virtual message<_Target_type>* accept_message(runtime_object_identity _MsgId) = 0;

Параметры

_MsgId
Идентификатор message объекта среды выполнения объекта.

Возвращаемое значение

Указатель на сообщение о том, что вызывающий объект теперь имеет право владения.

Замечания

Чтобы передать владение, необходимо вернуть исходный указатель сообщения. Чтобы сохранить владение, необходимо сделать и вернуть копию полезных данных сообщения.

acquire_ref

Получает количество ссылок для этого source_block объекта, чтобы предотвратить удаление.

virtual void acquire_ref(_Inout_ ITarget<_Target_type> *);

Замечания

Этот метод вызывается ITarget объектом, связанным с этим источником во время link_target метода.

async_send

Асинхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано.

virtual void async_send(_Inout_opt_ message<_Target_type>* _Msg);

Параметры

_Msg
Указатель на объект для message асинхронной отправки.

использовать

Использует сообщение, ранее предлагаемое этим source_block объектом, и успешно зарезервировано целевым объектом, передавая владельца вызывающему объекту.

virtual message<_Target_type>* consume(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<_Target_type>* _PTarget);

Параметры

_MsgId
Зарезервированный runtime_object_identitymessage объект.

_PTarget
Указатель на целевой блок, вызывающий consume метод.

Возвращаемое значение

Указатель на объект, на который вызывающий message объект теперь имеет право владения.

Замечания

Метод создает исключение invalid_argument , если параметр _PTarget имеет значение NULL.

Метод создает исключение bad_target , если параметр _PTarget не представляет целевой объект, который вызывается reserve.

Метод consume аналогичен accept, но всегда должен предшествовать вызову reserve возвращаемого true.

consume_message

При переопределении в производном классе использует сообщение, ранее зарезервированное.

virtual message<_Target_type>* consume_message(runtime_object_identity _MsgId) = 0;

Параметры

_MsgId
Используемый runtime_object_identitymessage объект.

Возвращаемое значение

Указатель на сообщение о том, что вызывающий объект теперь имеет право владения.

Замечания

acceptАналогично, но всегда предшествует вызовуreserve.

enable_batched_processing

Активирует пакетную обработку для этого блока.

void enable_batched_processing();

initialize_source

Инициализирует message_propagator внутри этого source_block.

void initialize_source(
    _Inout_opt_ Scheduler* _PScheduler = NULL,
    _Inout_opt_ ScheduleGroup* _PScheduleGroup = NULL);

Параметры

_PScheduler
Планировщик, используемый для планирования задач.

_PScheduleGroup
Группа расписаний, используемая для задач планирования.

Связывает целевой блок с этим source_block объектом.

virtual void link_target(_Inout_ ITarget<_Target_type>* _PTarget);

Параметры

_PTarget
Указатель на ITarget блок для связи с этим source_block объектом.

Замечания

Метод создает исключение invalid_argument , если параметр _PTarget имеет значение NULL.

Обратный вызов, уведомляющий о том, что новый целевой объект связан с этим source_block объектом.

virtual void link_target_notification(_Inout_ ITarget<_Target_type> *);

process_input_messages

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

virtual void process_input_messages(_Inout_ message<_Target_type>* _PMessage);

Параметры

_PMessage
Указатель на сообщение, которое необходимо обработать.

propagate_output_messages

Распространение сообщений в целевые объекты.

virtual void propagate_output_messages();

propagate_to_any_targets

При переопределении в производном классе распространяет данное сообщение на любые или все связанные целевые объекты. Это основная подпрограмма распространения для блоков сообщений.

virtual void propagate_to_any_targets(_Inout_opt_ message<_Target_type>* _PMessage);

Параметры

_PMessage
Указатель на сообщение, которое должно распространяться.

выпуска

Освобождает предыдущее успешное резервирование сообщений.

virtual void release(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<_Target_type>* _PTarget);

Параметры

_MsgId
Зарезервированный runtime_object_identitymessage объект.

_PTarget
Указатель на целевой блок, вызывающий release метод.

Замечания

Метод создает исключение invalid_argument , если параметр _PTarget имеет значение NULL.

Метод создает исключение bad_target , если параметр _PTarget не представляет целевой объект, который вызывается reserve.

release_message

При переопределении в производном классе освобождает предыдущее резервирование сообщений.

virtual void release_message(runtime_object_identity _MsgId) = 0;

Параметры

_MsgId
Объект runtime_object_identity , message который освобождается.

release_ref

Освобождает количество ссылок для этого source_block объекта.

virtual void release_ref(_Inout_ ITarget<_Target_type>* _PTarget);

Параметры

_PTarget
Указатель на целевой блок, вызывающий этот метод.

Замечания

Этот метод вызывается ITarget объектом, который не связан с этим источником. Исходный блок может освободить все ресурсы, зарезервированные для целевого блока.

remove_targets

Удаляет все целевые ссылки для этого исходного блока. Это должно вызываться из деструктора.

void remove_targets();

резерв

Резервирует сообщение, ранее предлагаемое этим source_block объектом.

virtual bool reserve(
    runtime_object_identity _MsgId,
    _Inout_ ITarget<_Target_type>* _PTarget);

Параметры

_MsgId
Предлагаемый runtime_object_identitymessage объект.

_PTarget
Указатель на целевой блок, вызывающий reserve метод.

Возвращаемое значение

true Значение , если сообщение успешно зарезервировано, false в противном случае. Резервирования могут завершаться неудачей по ряду причин, включая следующие: сообщение уже было зарезервировано или принято другим целевым объектом, источник может отклонять резервирования и т. п.

Замечания

Метод создает исключение invalid_argument , если параметр _PTarget имеет значение NULL.

После вызова reserve, если оно выполнено успешно, необходимо вызвать либо consume либо release , чтобы принять или отказаться от владения сообщением соответственно.

reserve_message

При переопределении в производном классе резервирует сообщение, ранее предлагаемое этим source_block объектом.

virtual bool reserve_message(runtime_object_identity _MsgId) = 0;

Параметры

_MsgId
Зарезервированный runtime_object_identitymessage объект.

Возвращаемое значение

true Значение , если сообщение успешно зарезервировано, false в противном случае.

Замечания

После reserve вызова, если он возвращается true, consumerelease либо должен вызываться для принятия или освобождения владения сообщением.

resume_propagation

При переопределении в производном классе возобновляется распространение после освобождения резервирования.

virtual void resume_propagation() = 0;

source_block

Формирует объект source_block.

source_block();

~source_block

Уничтожает source_block объект.

virtual ~source_block();

sync_send

Синхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано.

virtual void sync_send(_Inout_opt_ message<_Target_type>* _Msg);

Параметры

_Msg
Указатель на message объект для синхронной отправки.

Отменяет связь целевого блока из этого source_block объекта.

virtual void unlink_target(_Inout_ ITarget<_Target_type>* _PTarget);

Параметры

_PTarget
Указатель на ITarget блок для отмены связи с этим source_block объектом.

Замечания

Метод создает исключение invalid_argument , если параметр _PTarget имеет значение NULL.

Обратный вызов, уведомляющий о том, что целевой объект не связывали с этим source_block объектом.

virtual void unlink_target_notification(_Inout_ ITarget<_Target_type>* _PTarget);

Параметры

_PTarget
Блок ITarget , который был отключен.

Отменяет связь всех целевых блоков из этого source_block объекта.

virtual void unlink_targets();

wait_for_outstanding_async_sends

Ожидает завершения всех асинхронных распространений. Это ожидание спина, зависящее от распространения, используется в деструкторах блоков сообщений, чтобы убедиться, что все асинхронные распространения имеют время завершения перед уничтожением блока.

void wait_for_outstanding_async_sends();

См. также

Пространство имен concurrency
Класс ISource