Класс 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 | Ожидает завершения всех асинхронных распространений. Это ожидание спина, зависящее от распространения, используется в деструкторах блоков сообщений, чтобы убедиться, что все асинхронные распространения имеют время завершения перед уничтожением блока. |
Замечания
Блоки сообщений должны быть производными от этого блока, чтобы воспользоваться преимуществами управления ссылками и синхронизации, предоставляемых этим классом.
Иерархия наследования
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_identity
message
объект.
_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_identity
message
объект.
_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_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
.
link_target_notification
Обратный вызов, уведомляющий о том, что новый целевой объект связан с этим 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_identity
message
объект.
_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_identity
message
объект.
_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_identity
message
объект.
Возвращаемое значение
true
Значение , если сообщение успешно зарезервировано, false
в противном случае.
Замечания
После reserve
вызова, если он возвращается true
, consume
release
либо должен вызываться для принятия или освобождения владения сообщением.
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
объект для синхронной отправки.
unlink_target
Отменяет связь целевого блока из этого source_block
объекта.
virtual void unlink_target(_Inout_ ITarget<_Target_type>* _PTarget);
Параметры
_PTarget
Указатель на ITarget
блок для отмены связи с этим source_block
объектом.
Замечания
Метод создает исключение invalid_argument , если параметр _PTarget
имеет значение NULL
.
unlink_target_notification
Обратный вызов, уведомляющий о том, что целевой объект не связывали с этим 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();