Compartir a través de


source_block (Clase)

La clase source_block es una clase base abstracta solo para bloques de origen. La clase proporciona funcionalidad de administración de vínculo básico, así como comprobaciones de errores frecuentes.

Sintaxis

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

Parámetros

_TargetLinkRegistry
Registro de vínculos que se usará para contener los vínculos de destino.

_MessageProcessorType
Tipo de procesador para el procesamiento de mensajes.

Miembros

Definiciones de tipos públicas

Nombre Descripción
target_iterator El iterador para recorrer los destinos conectados.

Constructores públicos

Nombre Descripción
source_block Construye un objeto source_block.
Destructor ~source_block Destruye el objeto source_block.

Métodos públicos

Nombre Descripción
accept Acepta un mensaje ofrecido por este objeto source_block y transfiere la propiedad al autor de la llamada.
acquire_ref Adquiere un recuento de referencias en este objeto source_block para evitar la eliminación.
consumo Consume un mensaje ofrecido previamente por este objeto source_block y correctamente reservado por el destinatario, transfiriendo la propiedad a quien realiza la llamada.
link_target Vincula un bloque de destino a este objeto source_block.
release Libera una reserva exitosa de mensajes anterior.
release_ref Libera un recuento de referencias en este objeto source_block.
reserve Reserva un mensaje ofrecido anteriormente por este objeto source_block.
unlink_target Desvincula un bloque de destino de este objeto source_block.
unlink_targets Desvincula todos los bloques de destino de este objeto source_block. (Invalida ISource::unlink_targets.)

Métodos protegidos

Nombre Descripción
aceptar_mensaje Cuando se invalida en una clase derivada, acepta un mensaje ofrecido por el origen. Los bloques de mensajes deben invalidar este método para validar la _MsgId y devolver un mensaje.
async_send Pone en cola los mensajes de forma asincrónica e inicia una tarea de propagación, si aún no se ha realizado.
consume_message Cuando se invalida en una clase derivada, consume un mensaje que se reservó anteriormente.
enable_batched_processing Habilita el procesamiento por lotes para este bloque.
initialize_source Inicializa el message_propagator dentro de este source_block.
link_target_notification Callback que notifica que se ha vinculado un nuevo destino a este objeto source_block.
process_input_messages Procesa mensajes de entrada. Esto solo es útil para los bloques propagadores, que derivan de source_block
propagate_output_messages Propague mensajes a destinatarios.
propagar_a_cualquier_objetivo Cuando se invalida en una clase derivada, propaga el mensaje dado a cualquiera o todos los destinos vinculados. Esta es la rutina de propagación principal para los bloques de mensajes.
release_message Cuando se invalida en una clase derivada, libera una reserva de mensajes anterior.
eliminar_objetivos Quita todos los vínculos de destino de este bloque de origen. Esto se debe llamar desde el destructor.
mensaje_de_reserva Cuando se invalida en una clase derivada, reserva un mensaje ofrecido previamente por este objeto source_block.
resume_propagation Cuando se invalida en una clase derivada, reanuda la propagación una vez que se ha liberado una reserva.
sync_send Coloca los mensajes en cola sincrónicamente e inicia una tarea de propagación, si esto aún no se ha realizado.
unlink_target_notification Un callback que notifica que un destino ha sido desvinculado de este objeto source_block.
wait_for_outstanding_async_sends Espera a que se completen todas las propagaciones asincrónicas. Esta espera de giro específica del propagador se usa en destructores de bloques de mensajes para asegurarse de que todas las propagaciones asincrónicas tengan tiempo de finalizar antes de destruir el bloque.

Comentarios

Los bloques de mensajes deben derivarse de este bloque para aprovechar la administración de vínculos y la sincronización proporcionadas por esta clase.

Jerarquía de herencia

ISource

source_block

Requisitos

Encabezado: agents.h

Espacio de nombres: simultaneidad

aceptar

Acepta un mensaje ofrecido por este objeto source_block y transfiere la propiedad al autor de la llamada.

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

Parámetros

_MsgId
El valor runtime_object_identity del objeto message ofrecido.

_PTarget
Un puntero al bloque objetivo que está llamando al método accept.

Valor devuelto

Puntero al objeto message del que el autor de la llamada tiene ahora la propiedad.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

Un destino llama al método accept mientras este bloque ISource está ofreciendo un mensaje. El puntero de mensaje devuelto puede ser diferente del que se pasa al método propagate del bloque ITarget, si este origen decide realizar una copia del mensaje.

mensaje_de_aceptación

Cuando se invalida en una clase derivada, acepta un mensaje ofrecido por el origen. Los bloques de mensajes deben invalidar este método para validar la _MsgId y devolver un mensaje.

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

Parámetros

_MsgId
La identidad del objeto en tiempo de ejecución del objeto message.

Valor devuelto

Un puntero al mensaje del que ahora el llamante es propietario.

Comentarios

Para transferir la propiedad, se debe devolver el puntero de mensaje original. Para mantener la propiedad, es necesario crear y devolver una copia de la carga del mensaje.

adquirir_referencia

Adquiere un recuento de referencias en este objeto source_block para evitar la eliminación.

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

Comentarios

Un objeto ITarget que está vinculado a este origen llama a este método durante el método link_target.

async_send

Pone en cola los mensajes de forma asincrónica e inicia una tarea de propagación, si aún no se ha realizado.

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

Parámetros

_Msg
Un puntero a un objeto message para ser enviado de forma asincrónica.

consumir

Consume un mensaje ofrecido previamente por este objeto source_block y correctamente reservado por el destinatario, transfiriendo la propiedad a quien realiza la llamada.

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

Parámetros

_MsgId
runtime_object_identity del objeto message reservado.

_PTarget
Un puntero al bloque objetivo que está llamando al método consume.

Valor devuelto

Puntero al objeto message del que el autor de la llamada tiene ahora la propiedad.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

El método produce una excepción bad_target si el parámetro _PTarget no representa el destino que llamó a reserve.

El método consume es similar a accept, pero siempre debe ir precedido de una llamada a reserve que haya devuelto true.

consumir_mensaje

Cuando se invalida en una clase derivada, consume un mensaje que se reservó anteriormente.

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

Parámetros

_MsgId
Valor runtime_object_identity del objeto message que se consumirá.

Valor devuelto

Un puntero al mensaje del que ahora el llamante es propietario.

Comentarios

Es similar a accept, pero siempre va precedido de una llamada a reserve.

habilitar_procesamiento_por_lotes

Habilita el procesamiento por lotes para este bloque.

void enable_batched_processing();

inicializar_fuente

Inicializa el message_propagator dentro de este source_block.

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

Parámetros

_PScheduler
El programador que se usará para programar tareas.

_PScheduleGroup
El grupo de programación que se usará para programar tareas.

Vincula un bloque de destino a este objeto source_block.

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

Parámetros

_PTarget
Un puntero a un bloque ITarget que se va a vincular a este objeto source_block.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

Callback que notifica que se ha vinculado un nuevo destino a este objeto source_block.

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

procesar_mensajes_de_entrada

Procesa mensajes de entrada. Esto solo es útil para los bloques propagadores, que derivan de source_block

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

Parámetros

_PMessage
Un puntero al mensaje que se procesará.

propagar_mensajes_de_salida

Propague mensajes a destinatarios.

virtual void propagate_output_messages();

propagar_a_cualquier_destino

Cuando se invalida en una clase derivada, propaga el mensaje dado a cualquiera o todos los destinos vinculados. Esta es la rutina de propagación principal para los bloques de mensajes.

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

Parámetros

_PMessage
Un puntero al mensaje que se propagará.

lanzamiento

Libera una reserva exitosa de mensajes anterior.

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

Parámetros

_MsgId
runtime_object_identity del objeto message reservado.

_PTarget
Un puntero al bloque objetivo que está llamando al método release.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

El método produce una excepción bad_target si el parámetro _PTarget no representa el destino que llamó a reserve.

mensaje_de_lanzamiento

Cuando se invalida en una clase derivada, libera una reserva de mensajes anterior.

virtual void release_message(runtime_object_identity _MsgId) = 0;

Parámetros

_MsgId
El valor runtime_object_identity del objeto message que se libera.

release_ref

Libera un recuento de referencias en este objeto source_block.

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

Parámetros

_PTarget
Un puntero hacia el bloque de destino que está llamando a este método.

Comentarios

Este método es llamado por un objeto ITarget que está siendo desenlazado de este origen. El bloque de origen está permitido liberar los recursos reservados para el bloque de destino.

eliminar_objetivos

Quita todos los vínculos de destino de este bloque de origen. Esto se debe llamar desde el destructor.

void remove_targets();

reserva

Reserva un mensaje ofrecido anteriormente por este objeto source_block.

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

Parámetros

_MsgId
El valor runtime_object_identity del objeto message ofrecido.

_PTarget
Un puntero al bloque objetivo que está llamando al método reserve.

Valor devuelto

true si se ha reservado correctamente el mensaje; de lo contrario, false. Las reservas pueden fallar por muchas razones, como que otro destino ya haya reservado o aceptado el mensaje, que el origen pueda denegar las reservas, etc.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

Después de llamar a reserve, si tiene éxito, debe llamar a consume o release para tomar posesión del mensaje o renunciar a ella, respectivamente.

reserve_message

Cuando se invalida en una clase derivada, reserva un mensaje ofrecido previamente por este objeto source_block.

virtual bool reserve_message(runtime_object_identity _MsgId) = 0;

Parámetros

_MsgId
El runtime_object_identity del objeto message que se está reservando.

Valor devuelto

true si se ha reservado correctamente el mensaje; de lo contrario, false.

Comentarios

Después de llamar a reserve, si devuelve true, se debe llamar a consume o release para aceptar o liberar la propiedad del mensaje.

resume_propagation

Cuando se invalida en una clase derivada, reanuda la propagación una vez que se ha liberado una reserva.

virtual void resume_propagation() = 0;

source_block

Construye un objeto source_block.

source_block();

~source_block

Destruye el objeto source_block.

virtual ~source_block();

enviar_sincronizado

Coloca los mensajes en cola sincrónicamente e inicia una tarea de propagación, si esto aún no se ha realizado.

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

Parámetros

_Msg
Un puntero a un objeto message que se enviará de forma sincrónica.

Desvincula un bloque de destino de este objeto source_block.

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

Parámetros

_PTarget
Un puntero a un bloque ITarget que se desvinculará de este objeto source_block.

Comentarios

El método produce una excepción invalid_argument si el parámetro _PTarget es NULL.

Un callback que notifica que un destino ha sido desvinculado de este objeto source_block.

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

Parámetros

_PTarget
El bloque ITarget que se desvinculó.

Desvincula todos los bloques de destino de este objeto source_block.

virtual void unlink_targets();

esperar_sends_asincrónicos_pendientes

Espera a que se completen todas las propagaciones asincrónicas. Esta espera de giro específica del propagador se usa en destructores de bloques de mensajes para asegurarse de que todas las propagaciones asincrónicas tengan tiempo de finalizar antes de destruir el bloque.

void wait_for_outstanding_async_sends();

Consulte también

espacio de nombres de concurrencia
ISource (clase)