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
Vincula o registro a ser usado para manter os links de destino.

_MessageProcessorType
Tipo de processador para processamento de mensagens.

Membros

Typedefs públicos

Nome Descrição
target_iterator O iterador para percorrer os 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.
release Libera uma reserva de mensagem anterior bem-sucedida.
release_ref Libera uma contagem de referências nesse 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. (Substitui 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.
link_target_notification Um retorno de chamada que notifica que um novo destino foi vinculado a esse objeto source_block.
process_input_messages Processa mensagens de entrada. Isso só é útil para blocos propagadores que derivam de source_block
propagate_output_messages Propaga mensagens para destinos.
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.
release_message Quando substituído em uma classe derivada, libera uma reserva de mensagem anterior.
remove_targets Remove todos os links de destino para esse bloco de origem. Isso deve ser chamado do destruidor.
reserve_message Quando substituído em uma classe derivada, reserva uma mensagem oferecida anteriormente por esse 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 retorno de chamada que notifica que um destino foi desvinculado desse objeto source_block.
wait_for_outstanding_async_sends Aguarda a conclusão de todas as propagações assíncronas. 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: concurrency

accept

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.

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.

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, o ponteiro da mensagem original deve ser retornado. 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 para um objeto message a ser enviado 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 consume método é semelhante a accept, mas deve ser sempre precedido por uma chamada para reserve o retornado true.

consume_message

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.

enable_batched_processing

Habilita o processamento em lote para esse bloco.

void enable_batched_processing();

initialize_source

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 agendado a ser usado para tarefas de agendamento.

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 retorno de chamada que notifica que um novo destino foi vinculado a esse objeto source_block.

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

process_input_messages

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.

propagate_output_messages

Propaga mensagens para destinos.

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.

release

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.

release_message

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á sendo liberado.

release_ref

Libera uma contagem de referências nesse 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

Remove todos os links de destino para esse bloco de origem. Isso deve ser chamado do destruidor.

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 êxito; 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.

reserve_message

Quando substituído em uma classe derivada, reserva uma mensagem oferecida anteriormente por esse 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 êxito; 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 a 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 um bloco ITarget a ser desvinculado desse objeto source_block.

Comentários

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

Um retorno de chamada que notifica que um destino foi desvinculado desse 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();

wait_for_outstanding_async_sends

Aguarda a conclusão de todas as propagações assíncronas. 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 simultaneidade
Classe ISource