Compartilhar via


Classe source_block

A classe source_block é uma classe base abstrata para blocos somente de origem. A classe fornece funcionalidade básica de gerenciamento de link, bem como verificações de erros comuns.

Sintaxe

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 links a ser usado para armazenar os links de destino.

_MessageProcessorType
Tipo de processador para processamento de mensagens.

Membros

Typedefs públicos

Nome Descrição
target_iterator O iterador para navegar pelos destinos conectados.

Construtores públicos

Nome Descrição
source_block Constrói um objeto source_block.
Destruidor de ~source_block Destrói o objeto source_block.

Métodos públicos

Nome Descrição
accept Aceita uma mensagem que foi oferecida por esse objeto source_block, transferindo a propriedade para o chamador.
acquire_ref Adquire uma contagem de referências nesse objeto source_block para evitar a exclusão.
consumir Consome uma mensagem oferecida anteriormente por esse objeto source_block e reservada com êxito pelo destino, transferindo a propriedade para o chamador.
link_target Vincula um bloco de destino a esse objeto source_block.
lançamento Libera uma reserva de mensagem anterior bem-sucedida.
release_ref Libera uma contagem de referências neste objeto source_block.
reserve Reserva uma mensagem anteriormente oferecida por este objeto source_block.
unlink_target Desvincula um bloco de destino desse objeto source_block.
unlink_targets Desvincula todos os blocos de destino desse objeto source_block. (Sobrescreve ISource::unlink_targets.)

Métodos protegidos

Nome Descrição
accept_message Quando substituído em uma classe derivada, aceita uma mensagem oferecida pela origem. Os blocos de mensagens devem substituir esse método para validar o _MsgId e retornar uma mensagem.
async_send Enfileira as mensagens de forma assíncrona e inicia uma tarefa de propagação, se isso ainda não tiver sido feito
consume_message Quando substituído em uma classe derivada, consome uma mensagem que foi anteriormente reservada.
enable_batched_processing Habilita o processamento em lote para esse bloco.
initialize_source Inicializa o message_propagator dentro deste source_block.
notificação_de_destino_de_link Um callback que informa que um novo destino foi vinculado a este objeto source_block.
processar_mensagens_de_entrada Processa mensagens de entrada. Isso só é útil para blocos propagadores que derivam de source_block
propagate_output_messages Propagar mensagens a alvos.
propagate_to_any_targets Quando substituído em uma classe derivada, propaga a mensagem fornecida para qualquer um dos destinos vinculados ou para todos eles. Essa é a principal rotina de propagação para blocos de mensagens.
mensagem_de_lançamento Quando substituído em uma classe derivada, libera uma reserva de mensagem anterior.
remove_targets Remova todos os links de destino deste bloco de origem. Isso deve ser chamado pelo destrutor.
reserve_message Quando sobreposto em uma classe derivada, reserva uma mensagem oferecida anteriormente por este objeto source_block.
resume_propagation Quando substituído em uma classe derivada, retoma a propagação após a liberação de uma reserva.
sync_send Enfileira mensagens de forma síncrona e inicia uma tarefa de propagação, se isso ainda não tiver sido feito.
unlink_target_notification Um callback que notifica que um alvo foi desvinculado deste objeto source_block.
esperar_por_envios_assíncronos_pendentes Aguarda até que todas as propagações assíncronas sejam concluídas. Essa espera de rotação específica do propagador é usada em destruidores de blocos de mensagem para garantir que todas as propagações assíncronas tenham tempo para serem concluídas antes da destruição do bloco.

Comentários

Os blocos de mensagens devem derivar desse bloco para aproveitar o gerenciamento de link e a sincronização fornecidos por essa classe.

Hierarquia de herança

ISource

source_block

Requisitos

Cabeçalho: agents.h

Namespace: simultaneidade

aceitar

Aceita uma mensagem que foi oferecida por esse objeto source_block, transferindo a propriedade para o chamador.

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

Parâmetros

_MsgId
O runtime_object_identity do objeto message oferecido.

_PTarget
Um ponteiro para o bloco de destino que está chamando o método accept.

Valor de retorno

Um ponteiro para o objeto message do qual o chamador agora tem propriedade.

Comentários

O método gera uma exceção invalid_argument se o parâmetro _PTarget for NULL.

O método accept é chamado por um destino enquanto uma mensagem está sendo oferecida por esse bloco ISource. O ponteiro de mensagem retornado pode ser diferente do passado para o método propagate do bloco ITarget, se essa fonte decidir fazer uma cópia da mensagem.

aceitar_mensagem

Quando substituído em uma classe derivada, aceita uma mensagem oferecida pela origem. Os blocos de mensagens devem substituir esse método para validar o _MsgId e retornar uma mensagem.

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

Parâmetros

_MsgId
A identidade do objeto de runtime do objeto message.

Valor de retorno

Um ponteiro para a mensagem da qual o chamador agora tem propriedade.

Comentários

Para transferir a propriedade, devemos retornar o ponteiro da mensagem original. Para manter a propriedade, uma cópia do conteúdo da mensagem precisa ser feita e retornada.

acquire_ref

Adquire uma contagem de referências nesse objeto source_block para evitar a exclusão.

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

Comentários

Esse método é chamado por um objeto ITarget que está sendo vinculado a essa fonte durante o método link_target.

async_send

Enfileira as mensagens de forma assíncrona e inicia uma tarefa de propagação, se isso ainda não tiver sido feito

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

Parâmetros

_Msg
Um ponteiro que aponta para um objeto message a enviar de forma assíncrona.

consumir

Consome uma mensagem oferecida anteriormente por esse objeto source_block e reservada com êxito pelo destino, transferindo a propriedade para o chamador.

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

Parâmetros

_MsgId
O runtime_object_identity do objeto reservado message.

_PTarget
Um ponteiro para o bloco de destino que está chamando o método consume.

Valor de retorno

Um ponteiro para o objeto message do qual o chamador agora tem propriedade.

Comentários

O método gera uma exceção invalid_argument se o parâmetro _PTarget for NULL.

O método gera uma exceção bad_target se o parâmetro _PTarget não representar o destino que chamou reserve.

O método consume é semelhante a accept, mas deve ser sempre precedido por uma chamada para reserve que retornou true.

consumir_mensagem

Quando substituído em uma classe derivada, consome uma mensagem que foi anteriormente reservada.

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

Parâmetros

_MsgId
O runtime_object_identity do objeto message que está sendo consumido.

Valor de retorno

Um ponteiro para a mensagem da qual o chamador agora tem propriedade.

Comentários

Semelhante a accept, mas é sempre precedido por uma chamada para reserve.

ativar_processamento_em_lotes

Habilita o processamento em lote para esse bloco.

void enable_batched_processing();

inicializar_fonte

Inicializa o message_propagator dentro deste source_block.

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

Parâmetros

_PScheduler
O agendador a ser usado para tarefas de agendamento.

_PScheduleGroup
O grupo de agendamento a ser usado para agendar tarefas.

Vincula um bloco de destino a esse objeto source_block.

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

Parâmetros

_PTarget
Um ponteiro para um bloco ITarget para vincular a esse objeto source_block.

Comentários

O método gera uma exceção invalid_argument se o parâmetro _PTarget for NULL.

Um callback que informa que um novo destino foi vinculado a este objeto source_block.

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

processar_mensagens_de_entrada

Processa mensagens de entrada. Isso só é útil para blocos propagadores que derivam de source_block

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

Parâmetros

_PMessage
Um ponteiro para a mensagem que deve ser processada.

propagar_mensagens_de_saida

Propagar mensagens a alvos.

virtual void propagate_output_messages();

propagate_to_any_targets

Quando substituído em uma classe derivada, propaga a mensagem fornecida para qualquer um dos destinos vinculados ou para todos eles. Essa é a principal rotina de propagação para blocos de mensagens.

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

Parâmetros

_PMessage
Um ponteiro para a mensagem que deve ser propagada.

versão

Libera uma reserva de mensagem anterior bem-sucedida.

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

Parâmetros

_MsgId
O runtime_object_identity do objeto reservado message.

_PTarget
Um ponteiro para o bloco de destino que está chamando o método release.

Comentários

O método gera uma exceção invalid_argument se o parâmetro _PTarget for NULL.

O método gera uma exceção bad_target se o parâmetro _PTarget não representar o destino que chamou reserve.

mensagem_de_lançamento

Quando substituído em uma classe derivada, libera uma reserva de mensagem anterior.

virtual void release_message(runtime_object_identity _MsgId) = 0;

Parâmetros

_MsgId
O runtime_object_identity do objeto message que está para ser liberado.

release_ref

Libera uma contagem de referências neste objeto source_block.

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

Parâmetros

_PTarget
Um ponteiro para o bloco de destino que está chamando esse método.

Comentários

Esse método é chamado por um objeto ITarget que está sendo desvinculado dessa fonte. O bloco de origem tem permissão para liberar todos os recursos reservados para o bloco de destino.

remove_targets

Remova todos os links de destino deste bloco de origem. Isso deve ser chamado pelo destrutor.

void remove_targets();

reserve

Reserva uma mensagem anteriormente oferecida por este objeto source_block.

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

Parâmetros

_MsgId
O runtime_object_identity do objeto message oferecido.

_PTarget
Um ponteiro para o bloco de destino que está chamando o método reserve.

Valor de retorno

true se a mensagem foi reservada com sucesso; caso contrário, false. As reservas podem falhar por muitos motivos, incluindo: a mensagem já foi reservada ou aceita por outro destino, a origem pode negar reservas etc.

Comentários

O método gera uma exceção invalid_argument se o parâmetro _PTarget for NULL.

Depois de chamar reserve, se tiver êxito, você deverá chamar consume ou release para assumir ou conceder a posse da mensagem, respectivamente.

mensagem_reserva

Quando sobreposto em uma classe derivada, reserva uma mensagem oferecida anteriormente por este objeto source_block.

virtual bool reserve_message(runtime_object_identity _MsgId) = 0;

Parâmetros

_MsgId
O runtime_object_identity do objeto message que está sendo reservado.

Valor de retorno

true se a mensagem foi reservada com sucesso; caso contrário, false.

Comentários

Depois de reserve ser chamado, se ele retornar true, consume ou release deverá ser chamado para assumir ou liberar a propriedade da mensagem.

resume_propagation

Quando substituído em uma classe derivada, retoma a propagação após a liberação de uma reserva.

virtual void resume_propagation() = 0;

source_block

Constrói um objeto source_block.

source_block();

~ source_block

Destrói o objeto source_block.

virtual ~source_block();

sync_send

Enfileira mensagens de forma síncrona e inicia uma tarefa de propagação, se isso ainda não tiver sido feito.

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

Parâmetros

_Msg
Um ponteiro para um objeto message que deve ser enviado de forma síncrona.

Desvincula um bloco de destino desse objeto source_block.

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

Parâmetros

_PTarget
Um ponteiro para desvincular um bloco ITarget deste objeto source_block.

Comentários

O método gera uma exceção invalid_argument se o parâmetro _PTarget for NULL.

Um callback que notifica que um alvo foi desvinculado deste objeto source_block.

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

Parâmetros

_PTarget
O bloco ITarget que foi desvinculado.

Desvincula todos os blocos de destino desse objeto source_block.

virtual void unlink_targets();

esperar_por_envios_assíncronos_pendentes

Aguarda até que todas as propagações assíncronas sejam concluídas. Essa espera de rotação específica do propagador é usada em destruidores de blocos de mensagem para garantir que todas as propagações assíncronas tenham tempo para serem concluídas antes da destruição do bloco.

void wait_for_outstanding_async_sends();

Confira também

Namespace de concorrência
Classe ISource