Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Класс 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();