Freigeben über


source_block-Klasse

Die source_block-Klasse ist eine abstrakte Basisklasse ausschließlich für Quellblöcke. Die Klasse stellt grundlegende Linkmanagementfunktionalität sowie allgemeine Fehlerüberprüfungen bereit.

Syntax

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

Parameter

_TargetLinkRegistry
Die Registrierung zum Speichern der Ziellinks.

_MessageProcessorType
Prozessortyp für die Nachrichtenverarbeitung.

Mitglieder

Öffentliche Typedefs

Name Beschreibung
target_iterator Der Iterator zum Durchlaufen der verbundenen Ziele.

Öffentliche Konstruktoren

Name Beschreibung
source_block Erstellt ein source_block-Objekt.
~source_block Destruktor Zerstört das source_block-Objekt.

Öffentliche Methoden

Name Beschreibung
annehmen Akzeptiert eine Nachricht, die von diesem source_block Objekt angeboten wurde, und überträgt den Besitz an den Aufrufer.
referenz_erwerben Dient zum Abrufen einer Verweisanzahl für dieses source_block Objekt, um das Löschen zu verhindern.
Verbrauchen Verbraucht eine Nachricht, die zuvor von diesem source_block Objekt angeboten und vom Ziel erfolgreich reserviert wurde, und überträgt den Besitz an den Aufrufer.
link_target Verknüpft einen Zielblock mit diesem source_block Objekt.
Freigabe Löst eine vorherige erfolgreiche Nachrichtenreservierung auf.
release_ref Gibt eine Referenzanzahl für dieses source_block Objekt frei.
reserve Reserviert eine nachricht, die zuvor von diesem source_block Objekt angeboten wurde.
unlink_target Entfernt die Verknüpfung eines Zielblocks von diesem source_block Objekt.
unlink_targets Hebt die Verknüpfung aller Zielblöcke von diesem source_block Objekt auf. (Überschreibt ISource::unlink_targets.)

Geschützte Methoden

Name Beschreibung
nachricht_akzeptieren Wenn eine abgeleitete Klasse außer Kraft gesetzt wird, akzeptiert die Quelle eine angebotene Nachricht. Nachrichtenblöcke sollten diese Methode überschreiben, um die _MsgId Nachricht zu überprüfen und zurückzugeben.
async_send Stellt Nachrichten asynchron in die Warteschlange und startet eine Verteilungsaufgabe, sofern dies noch nicht geschehen ist.
consume_message Wenn sie in einer abgeleiteten Klasse überschrieben wird, verbraucht sie eine zuvor reservierte Nachricht.
aktive_batch_verarbeitung Aktiviert die Batchverarbeitung für diesen Block.
initialize_source Initialisiert die message_propagator innerhalb dieses source_block.
link_target_notification Ein Rückruf, der benachrichtigt, dass ein neues Ziel mit diesem source_block Objekt verknüpft wurde.
verarbeite_eingabe_nachrichten Verarbeiten von Eingabemeldungen. Dies ist nur für Verteilungsblöcke nützlich, die von source_block abgeleitet werden.
propagate_output_messages Verteilen sie Nachrichten an Ziele.
auf_beliebige_Ziele_übertragen Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, wird die angegebene Nachricht an beliebige oder alle verknüpften Ziele weitergegeben. Dies ist die Hauptverteilungsroutine für Nachrichtenblöcke.
release_message Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, wird eine vorherige Nachrichtenreservierung freigegeben.
Ziele_entfernen Entfernt alle Ziellinks für diesen Quellblock. Dies sollte vom Destruktor aufgerufen werden.
reserve_message Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, behält sich eine nachricht vor, die zuvor von diesem source_block Objekt angeboten wurde.
resume_propagation Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird die Verteilung fortgesetzt, nachdem eine Reservierung freigegeben wurde.
sync_send Synchron fügt Nachrichten in die Warteschlange ein und startet eine Ausbreitungsaufgabe, sofern dies noch nicht geschehen ist.
unlink_target_notification Ein Rückruf, der benachrichtigt, dass ein Ziel von diesem source_block Objekt getrennt wurde.
Warte auf ausstehende asynchrone Sendungen Wartet, bis alle asynchronen Ausbreitungen abgeschlossen sind. Diese für den Propagator spezifische Spin-Warte wird in Destruktoren von Nachrichtenblöcken verwendet, um sicherzustellen, dass alle asynchronen Ausführungen Zeit haben, abgeschlossen zu werden, bevor der Block zerstört wird.

Hinweise

Nachrichtenblöcke sollten von diesem Block abgeleitet werden, um die Von dieser Klasse bereitgestellte Linkverwaltung und Synchronisierung zu nutzen.

Vererbungshierarchie

ISource

source_block

Anforderungen

Header: agents.h

Namespace: Parallelität

Akzeptieren

Akzeptiert eine Nachricht, die von diesem source_block Objekt angeboten wurde, und überträgt den Besitz an den Aufrufer.

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

Parameter

_MsgId
Das runtime_object_identity angebotene message Objekt.

_PTarget
Ein Zeiger auf den Zielblock, der die accept Methode aufruft.

Rückgabewert

Ein Zeiger auf das message Objekt, dessen Besitzer der Aufrufer jetzt ist.

Hinweise

Die Methode löst eine invalid_argument Ausnahme aus, wenn der Parameter _PTarget lautet NULL.

Die accept Methode wird von einem Ziel aufgerufen, während eine Nachricht von diesem ISource Block angeboten wird. Der zurückgegebene Nachrichtenzeiger unterscheidet sich möglicherweise von dem, das an die propagate Methode des ITarget Blocks übergeben wird, wenn sich diese Quelle entscheidet, eine Kopie der Nachricht zu erstellen.

Nachricht_annehmen

Wenn eine abgeleitete Klasse außer Kraft gesetzt wird, akzeptiert die Quelle eine angebotene Nachricht. Nachrichtenblöcke sollten diese Methode überschreiben, um die _MsgId Nachricht zu überprüfen und zurückzugeben.

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

Parameter

_MsgId
Die Laufzeitobjektidentität des message Objekts.

Rückgabewert

Ein Zeiger auf die Nachricht, deren Besitzer der Aufrufer jetzt ist.

Hinweise

Um den Besitz zu übertragen, sollte der ursprüngliche Nachrichtenzeiger zurückgegeben werden. Um den Besitz beizubehalten, muss eine Kopie der Nachrichtennutzlast erstellt und zurückgegeben werden.

acquire_ref

Dient zum Abrufen einer Verweisanzahl für dieses source_block Objekt, um das Löschen zu verhindern.

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

Hinweise

Diese Methode wird von einem ITarget Objekt aufgerufen, das während der link_target Methode mit dieser Quelle verknüpft wird.

async_send

Stellt Nachrichten asynchron in die Warteschlange und startet eine Verteilungsaufgabe, sofern dies noch nicht geschehen ist.

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

Parameter

_Msg
Ein Zeiger auf ein message Objekt, das asynchron gesendet werden soll.

verbrauchen

Verbraucht eine Nachricht, die zuvor von diesem source_block Objekt angeboten und vom Ziel erfolgreich reserviert wurde, und überträgt den Besitz an den Aufrufer.

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

Parameter

_MsgId
Das runtime_object_identity reservierte message Objekt.

_PTarget
Ein Zeiger auf den Zielblock, der die consume Methode aufruft.

Rückgabewert

Ein Zeiger auf das message Objekt, dessen Besitzer der Aufrufer jetzt ist.

Hinweise

Die Methode löst eine invalid_argument Ausnahme aus, wenn der Parameter _PTarget lautet NULL.

Die Methode löst eine bad_target Ausnahme aus, wenn der Parameter _PTarget das aufgerufene reserveZiel nicht darstellt.

Die consume-Methode ähnelt accept, muss jedoch immer von einem Aufruf an reserve begleitet werden, der true zurückgegeben hat.

Nachricht_verarbeiten

Wenn sie in einer abgeleiteten Klasse überschrieben wird, verbraucht sie eine zuvor reservierte Nachricht.

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

Parameter

_MsgId
Das runtime_object_identity Objekt, das message verbraucht wird.

Rückgabewert

Ein Zeiger auf die Nachricht, deren Besitzer der Aufrufer jetzt ist.

Hinweise

Ähnlich wie accept, wird jedoch immer von einem Aufruf von reserve gefolgt.

Batch-Verarbeitung aktivieren

Aktiviert die Batchverarbeitung für diesen Block.

void enable_batched_processing();

Quelle initialisieren

Initialisiert die message_propagator innerhalb dieses source_block.

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

Parameter

_PScheduler
Der Zeitplaner, der für die Planung von Vorgängen verwendet werden soll.

_PScheduleGroup
Die Zeitplangruppe, die für die Planung von Vorgängen verwendet werden soll.

Verknüpft einen Zielblock mit diesem source_block Objekt.

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

Parameter

_PTarget
Ein Zeiger auf einen ITarget Block, der mit diesem source_block Objekt verknüpft werden soll.

Hinweise

Die Methode löst eine invalid_argument Ausnahme aus, wenn der Parameter _PTarget lautet NULL.

Ein Rückruf, der benachrichtigt, dass ein neues Ziel mit diesem source_block Objekt verknüpft wurde.

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

VerarbeiteEingabemeldungen

Verarbeiten von Eingabemeldungen. Dies ist nur für Verteilungsblöcke nützlich, die von source_block abgeleitet werden.

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

Parameter

_PMessage
Ein Zeiger auf die Nachricht, die verarbeitet werden soll.

AusgabeNachrichtenÜbertragen

Verteilen sie Nachrichten an Ziele.

virtual void propagate_output_messages();

an beliebige Ziele weiterleiten

Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, wird die angegebene Nachricht an beliebige oder alle verknüpften Ziele weitergegeben. Dies ist die Hauptverteilungsroutine für Nachrichtenblöcke.

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

Parameter

_PMessage
Ein Zeiger auf die Nachricht, die weitergegeben werden soll.

Freigabe

Löst eine vorherige erfolgreiche Nachrichtenreservierung auf.

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

Parameter

_MsgId
Das runtime_object_identity reservierte message Objekt.

_PTarget
Ein Zeiger auf den Zielblock, der die release Methode aufruft.

Hinweise

Die Methode löst eine invalid_argument Ausnahme aus, wenn der Parameter _PTarget lautet NULL.

Die Methode löst eine bad_target Ausnahme aus, wenn der Parameter _PTarget das aufgerufene reserveZiel nicht darstellt.

Freigabebenachrichtigung

Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, wird eine vorherige Nachrichtenreservierung freigegeben.

virtual void release_message(runtime_object_identity _MsgId) = 0;

Parameter

_MsgId
Das runtime_object_identity des message Objekts, das freigegeben wird.

release_ref

Gibt eine Referenzanzahl für dieses source_block Objekt frei.

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

Parameter

_PTarget
Ein Zeiger auf den Zielblock, der diese Methode aufruft.

Hinweise

Diese Methode wird von einem ITarget Objekt aufgerufen, das von dieser Quelle entkoppelt wird. Der Quellblock darf alle Ressourcen freigeben, die für den Zielblock reserviert sind.

Ziele entfernen

Entfernt alle Ziellinks für diesen Quellblock. Dies sollte vom Destruktor aufgerufen werden.

void remove_targets();

Reserve

Reserviert eine nachricht, die zuvor von diesem source_block Objekt angeboten wurde.

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

Parameter

_MsgId
Das runtime_object_identity angebotene message Objekt.

_PTarget
Ein Zeiger auf den Zielblock, der die reserve Methode aufruft.

Rückgabewert

true wenn die Nachricht erfolgreich reserviert wurde, false andernfalls. Reservierungen können aus vielen Gründen fehlschlagen, einschließlich: Die Nachricht wurde bereits von einem anderen Ziel reserviert oder akzeptiert, die Quelle kann Reservierungen ablehnen, und so weiter.

Hinweise

Die Methode löst eine invalid_argument Ausnahme aus, wenn der Parameter _PTarget lautet NULL.

Nach dem Aufrufen von reserve, wenn dies erfolgreich ist, müssen Sie entweder consume aufrufen oder release, um die Nachricht zu übernehmen oder abzugeben.

Reservierungsnachricht

Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, behält sich eine nachricht vor, die zuvor von diesem source_block Objekt angeboten wurde.

virtual bool reserve_message(runtime_object_identity _MsgId) = 0;

Parameter

_MsgId
Das runtime_object_identity Objekt, das message reserviert wird.

Rückgabewert

true wenn die Nachricht erfolgreich reserviert wurde, false andernfalls.

Hinweise

Nachdem reserve aufgerufen wurde, wenn true zurückgegeben wird, müssen entweder consume oder release aufgerufen werden, um den Besitz der Nachricht entweder zu übernehmen oder freizugeben.

resume_propagation

Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird die Verteilung fortgesetzt, nachdem eine Reservierung freigegeben wurde.

virtual void resume_propagation() = 0;

source_block

Erstellt ein source_block-Objekt.

source_block();

~source_block

Zerstört das source_block-Objekt.

virtual ~source_block();

sync_send

Synchron fügt Nachrichten in die Warteschlange ein und startet eine Ausbreitungsaufgabe, sofern dies noch nicht geschehen ist.

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

Parameter

_Msg
Ein Zeiger auf ein message Objekt, das synchron gesendet werden soll.

Entfernt die Verknüpfung eines Zielblocks von diesem source_block Objekt.

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

Parameter

_PTarget
Ein Zeiger auf einen ITarget Block, um die Verknüpfung von diesem source_block Objekt aufzuheben.

Hinweise

Die Methode löst eine invalid_argument Ausnahme aus, wenn der Parameter _PTarget lautet NULL.

Ein Rückruf, der benachrichtigt, dass ein Ziel von diesem source_block Objekt getrennt wurde.

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

Parameter

_PTarget
Der Block, der ITarget nicht verknüpft wurde.

Hebt die Verknüpfung aller Zielblöcke von diesem source_block Objekt auf.

virtual void unlink_targets();

warte_auf_ausstehende_asynchrone_sendungen

Wartet, bis alle asynchronen Ausbreitungen abgeschlossen sind. Diese für den Propagator spezifische Spin-Warte wird in Destruktoren von Nachrichtenblöcken verwendet, um sicherzustellen, dass alle asynchronen Ausführungen Zeit haben, abgeschlossen zu werden, bevor der Block zerstört wird.

void wait_for_outstanding_async_sends();

Siehe auch

Concurrency-Namespace
ISource-Klasse