Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
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.
link_target
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.
notificación_de_destino_de_enlace
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.
desvincular_objetivo
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.
notificación_de_desvinculación_de_objetivo
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ó.
desvincular_objetivos
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();