Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Класс 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
Тип процессора для обработки сообщений.
Участники
Общедоступные typedefы
| Имя | Описание |
|---|---|
target_iterator |
Итератор для обхода подключенных целевых объектов. |
Открытые конструкторы
| Имя | Описание |
|---|---|
| source_block | Формирует объект source_block. |
| Деструктор ~source_block | Уничтожает source_block объект. |
Открытые методы
| Имя | Описание |
|---|---|
| принимать | Принимает сообщение, которое было предложено этим source_block объектом, передавая владение вызывающему объекту. |
| получить_ссылку | Получает количество ссылок для этого source_block объекта, чтобы предотвратить удаление. |
| потреблять | Использует сообщение, ранее предлагавшееся этим source_block объектом и успешно зарезервированное целевым, передавая право собственности вызывающему. |
| link_target | Связывает целевой блок с этим source_block объектом. |
| релиз | Освобождает предыдущее успешное резервирование сообщений. |
| release_ref | Освобождает счетчик ссылок для этого source_block объекта. |
| резерв | Резервирует сообщение, ранее предлагаемое этим source_block объектом. |
| unlink_target | Разрывает связь целевого блока с этим source_block объектом. |
| unlink_targets | Отменяет связь всех целевых блоков из этого source_block объекта. (Переопределяет ISource::unlink_targets.) |
Защищенные методы
| Имя | Описание |
|---|---|
| accept_message | При переопределении в производном классе принимает сообщение, предложенное источником. Блоки сообщений должны переопределить этот метод, чтобы проверить _MsgId и вернуть сообщение. |
| async_send | Асинхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано. |
| consume_message | При переопределении в производном классе использует сообщение, ранее зарезервированное. |
| включить_пакетную_обработку | Активирует пакетную обработку для этого блока. |
| initialize_source | Инициализирует message_propagator внутри этого source_block. |
| уведомление_о_цели_ссылки | Обратный вызов, уведомляющий о том, что новый целевой объект связан с этим source_block объектом. |
| process_input_messages | Обработка входных сообщений. Подходит только для блоков распространения, производных от source_block. |
| распространить_выходные_сообщения | Распространять сообщения к целевым адресатам. |
| распространить_на_любые_цели | При переопределении в производном классе распространяет данное сообщение на любые или все связанные целевые объекты. Это основная процедура передачи для блоков сообщений. |
| release_message | При переопределении в производном классе освобождает ранее зарезервированное сообщение. |
| удалить_цели | Удаляет все целевые ссылки для этого исходного блока. Это должно вызываться из деструктора. |
| reserve_message | При переопределении в производном классе резервирует сообщение, ранее предлагаемое этим source_block объектом. |
| возобновить распространение | При переопределении в производном классе возобновляется распространение после снятия резервирования. |
| sync_send | Синхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано. |
| unlink_target_notification | Обратный вызов, уведомляющий о том, что целевой объект не связывали с этим source_block объектом. |
| wait_for_outstanding_async_sends | Ожидает завершения всех асинхронных распространений. В ожидании с вращением, зависящем от распространителя, используются деструкторы блоков сообщений, чтобы убедиться, что все асинхронные распространения успевают завершиться до уничтожения блока. |
Замечания
Блоки сообщений должны быть производными от этого блока, чтобы воспользоваться преимуществами управления ссылками и синхронизации, предоставляемых этим классом.
Иерархия наследования
source_block
Требования
Заголовок: agents.h
Пространство имен: конкурентность
принять
Принимает сообщение, которое было предложено этим 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, если источник решит сделать копию сообщения.
принять_сообщение
При переопределении в производном классе принимает сообщение, предложенное источником. Блоки сообщений должны переопределить этот метод, чтобы проверить _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.
асинхронная_отправка
Асинхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано.
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.
потребить_сообщение
При переопределении в производном классе использует сообщение, ранее зарезервированное.
virtual message<_Target_type>* consume_message(runtime_object_identity _MsgId) = 0;
Параметры
_MsgId
runtime_object_identity объекта message, который используется.
Возвращаемое значение
Указатель на сообщение, которым теперь владеет вызывающая сторона.
Замечания
Аналогично 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
Группа расписаний, используемая для задач планирования.
link_target
Связывает целевой блок с этим 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> *);
обработка_входящих_сообщений
Обработка входных сообщений. Подходит только для блоков распространения, производных от source_block.
virtual void process_input_messages(_Inout_ message<_Target_type>* _PMessage);
Параметры
_PMessage
Указатель на сообщение, которое необходимо обработать.
распространить_выходные_сообщения
Распространять сообщения к целевым адресатам.
virtual void propagate_output_messages();
распроcтранить_на_любые_цели
При переопределении в производном классе распространяет данное сообщение на любые или все связанные целевые объекты. Это основная процедура передачи для блоков сообщений.
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.
сообщение о выпуске
При переопределении в производном классе освобождает ранее зарезервированное сообщение.
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 объектом, который не связан с этим источником. Исходный блок может освободить все ресурсы, зарезервированные для целевого блока.
удаление_целей
Удаляет все целевые ссылки для этого исходного блока. Это должно вызываться из деструктора.
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 , чтобы принять или отказаться от владения сообщением соответственно.
сообщение_о_резервировании
При переопределении в производном классе резервирует сообщение, ранее предлагаемое этим source_block объектом.
virtual bool reserve_message(runtime_object_identity _MsgId) = 0;
Параметры
_MsgId
runtime_object_identity объекта message, который резервируется.
Возвращаемое значение
true если сообщение успешно забронировано, false в противном случае.
Замечания
После вызова reserve, если он возвращает true, должен быть вызван либо consume, либо release для принятия или освобождения владения сообщением.
возобновить_распространение
При переопределении в производном классе возобновляется распространение после снятия резервирования.
virtual void resume_propagation() = 0;
источник_блок
Формирует объект source_block.
source_block();
~source_block
Уничтожает source_block объект.
virtual ~source_block();
синхронная_отправка
Синхронно помещает сообщения в очередь и запускает задачу распространения, если это еще не сделано.
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, который был отсоединен.
unlink_targets
Отменяет связь всех целевых блоков из этого source_block объекта.
virtual void unlink_targets();
wait_for_outstanding_async_sends
Ожидает завершения всех асинхронных распространений. В ожидании с вращением, зависящем от распространителя, используются деструкторы блоков сообщений, чтобы убедиться, что все асинхронные распространения успевают завершиться до уничтожения блока.
void wait_for_outstanding_async_sends();