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
Verknüpfen Sie die Registrierung, die zum Halten der Ziellinks verwendet werden soll.
_MessageProcessorType
Prozessortyp für die Nachrichtenverarbeitung.
Member
Öffentliche Typedefs
Name | Beschreibung |
---|---|
target_iterator |
Der Iterator, um die verbundenen Ziele zu durchlaufen. |
Ö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. |
acquire_ref | Dient zum Abrufen einer Verweisanzahl für dieses source_block Objekt, um das Löschen zu verhindern. |
Nutzen | Nutzt eine Nachricht, die zuvor von diesem source_block Objekt angeboten wurde und vom Ziel erfolgreich reserviert wurde und den Besitz an den Aufrufer überträgt. |
link_target | Verknüpft einen Zielblock mit diesem source_block Objekt. |
release | Veröffentlicht eine vorherige erfolgreiche Nachrichtenreservierung. |
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 | Hebt die Verknüpfung eines Zielblocks von diesem source_block Objekt auf. |
unlink_targets | Hebt die Verknüpfung aller Zielblöcke von diesem source_block Objekt auf. (Außerkraftsetzungen ISource::unlink_targets.) |
Geschützte Methoden
Name | Beschreibung |
---|---|
accept_message | 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 außer Kraft gesetzt wird, wird eine zuvor reservierte Nachricht verwendet. |
enable_batched_processing | Aktiviert die Batchverarbeitung für diesen Block. |
initialize_source | Initialisiert die message_propagator innerhalb dieses source_block Bereichs. |
link_target_notification | Ein Rückruf, der benachrichtigt, dass ein neues Ziel mit diesem source_block Objekt verknüpft wurde. |
process_input_messages | Verarbeiten von Eingabemeldungen. Dies ist nur für Verteilungsblöcke nützlich, die von source_block |
propagate_output_messages | Verteilen sie Nachrichten an Ziele. |
propagate_to_any_targets | 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. |
remove_targets | 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 | Synchronisiert Nachrichten synchron in die Warteschlange und startet eine Verteilungsaufgabe, sofern dies noch nicht geschehen ist. |
unlink_target_notification | Ein Rückruf, der benachrichtigt, dass ein Ziel von diesem source_block Objekt nicht verknüpft wurde. |
wait_for_outstanding_async_sends | Wartet, bis alle asynchronen Verteilungen abgeschlossen sind. Diese verteilungsspezifische Spin-Wait wird in Destruktoren von Nachrichtenblöcken verwendet, um sicherzustellen, dass alle asynchronen Verteilungen Zeit haben, 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
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.
accept_message
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.
nutzen
Nutzt eine Nachricht, die zuvor von diesem source_block
Objekt angeboten wurde und vom Ziel erfolgreich reserviert wurde und den Besitz an den Aufrufer überträgt.
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 reserve
Ziel nicht darstellt.
Die consume
Methode ähnelt accept
, muss jedoch immer einem Aufruf dieser reserve
zurückgegebenen Methode true
vorangestellt werden.
consume_message
Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, wird eine zuvor reservierte Nachricht verwendet.
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
, aber wird immer ein Aufruf von reserve
.
enable_batched_processing
Aktiviert die Batchverarbeitung für diesen Block.
void enable_batched_processing();
initialize_source
Initialisiert die message_propagator
innerhalb dieses source_block
Bereichs.
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.
link_target
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
.
link_target_notification
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> *);
process_input_messages
Verarbeiten von Eingabemeldungen. Dies ist nur für Verteilungsblöcke nützlich, die von source_block
virtual void process_input_messages(_Inout_ message<_Target_type>* _PMessage);
Parameter
_PMessage
Ein Zeiger auf die Nachricht, die verarbeitet werden soll.
propagate_output_messages
Verteilen sie Nachrichten an Ziele.
virtual void propagate_output_messages();
propagate_to_any_targets
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
Veröffentlicht eine vorherige erfolgreiche Nachrichtenreservierung.
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 reserve
Ziel nicht darstellt.
release_message
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
Objekt, das message
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 nicht verknüpft wird. Der Quellblock darf alle Ressourcen freigeben, die für den Zielblock reserviert sind.
remove_targets
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 konnte Vorbehalte verweigern usw.
Hinweise
Die Methode löst eine invalid_argument Ausnahme aus, wenn der Parameter _PTarget
lautet NULL
.
Nach dem Anruf reserve
müssen Sie, falls dies erfolgreich ist, entweder consume
anrufen, oder release
um den Besitz der Nachricht zu übernehmen oder aufzugeben.
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.
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
Nach reserve
dem Aufruf, wenn er zurückgegeben true
wird, oder release
muss aufgerufen werden, consume
um entweder den Besitz der Nachricht 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
Synchronisiert Nachrichten synchron in die Warteschlange und startet eine Verteilungsaufgabe, 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.
unlink_target
Hebt die Verknüpfung eines Zielblocks von diesem source_block
Objekt auf.
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
.
unlink_target_notification
Ein Rückruf, der benachrichtigt, dass ein Ziel von diesem source_block
Objekt nicht verknüpft wurde.
virtual void unlink_target_notification(_Inout_ ITarget<_Target_type>* _PTarget);
Parameter
_PTarget
Der Block, der ITarget
nicht verknüpft wurde.
unlink_targets
Hebt die Verknüpfung aller Zielblöcke von diesem source_block
Objekt auf.
virtual void unlink_targets();
wait_for_outstanding_async_sends
Wartet, bis alle asynchronen Verteilungen abgeschlossen sind. Diese verteilungsspezifische Spin-Wait wird in Destruktoren von Nachrichtenblöcken verwendet, um sicherzustellen, dass alle asynchronen Verteilungen Zeit haben, bevor der Block zerstört wird.
void wait_for_outstanding_async_sends();