source_block — Klasa
Klasa source_block
jest abstrakcyjną klasą bazową dla bloków tylko do źródła. Klasa udostępnia podstawowe funkcje zarządzania linkami, a także typowe kontrole błędów.
Składnia
template<class _TargetLinkRegistry, class _MessageProcessorType = ordered_message_processor<typename _TargetLinkRegistry::type::type>>
class source_block : public ISource<typename _TargetLinkRegistry::type::type>;
Parametry
_TargetLinkRegistry
Rejestr łączy, który ma być używany do przechowywania linków docelowych.
_MessageProcessorType
Typ procesora do przetwarzania komunikatów.
Elementy członkowskie
Definicje typów publicznych
Nazwa/nazwisko | opis |
---|---|
target_iterator |
Iterator do chodzenia połączonych obiektów docelowych. |
Konstruktory publiczne
Nazwa/nazwisko | opis |
---|---|
source_block | source_block Tworzy obiekt. |
~source_block Destruktor | source_block Niszczy obiekt. |
Metody publiczne
Nazwa/nazwisko | opis |
---|---|
akceptować | Akceptuje komunikat oferowany przez ten source_block obiekt, przenosząc własność do obiektu wywołującego. |
acquire_ref | Uzyskuje liczbę odwołań dla tego source_block obiektu, aby zapobiec usunięciu. |
konsumować | Używa komunikatu oferowanego wcześniej przez ten source_block obiekt i pomyślnie zarezerwowanego przez obiekt docelowy, przenosząc własność do obiektu wywołującego. |
link_target | Łączy blok docelowy z tym source_block obiektem. |
zwolnić | Zwalnia poprzednią pomyślną rezerwację komunikatów. |
release_ref | Zwalnia liczbę odwołań dla tego source_block obiektu. |
rezerwować | Rezerwuje komunikat wcześniej oferowany przez ten source_block obiekt. |
unlink_target | Odłącza blok docelowy od tego source_block obiektu. |
unlink_targets | Odłącza wszystkie bloki docelowe z tego source_block obiektu. (Przesłonięcia) ISource::unlink_targets.) |
Metody chronione
Nazwa/nazwisko | opis |
---|---|
accept_message | Po zastąpieniu w klasie pochodnej akceptuje oferowany komunikat przez źródło. Bloki komunikatów powinny zastąpić tę metodę, aby zweryfikować _MsgId i zwrócić komunikat. |
async_send | Asynchronicznie kolejkuje komunikaty i uruchamia zadanie propagacji, jeśli jeszcze tego nie zrobiono |
consume_message | Po zastąpieniu w klasie pochodnej używa komunikatu, który był wcześniej zarezerwowany. |
enable_batched_processing | Włącza przetwarzanie wsadowe dla tego bloku. |
initialize_source | Inicjuje element message_propagator w tym source_block obiekcie . |
link_target_notification | Wywołanie zwrotne, które powiadamia o tym, że nowy obiekt docelowy został połączony z tym source_block obiektem. |
process_input_messages | Przetwarzanie komunikatów wejściowych. Jest to przydatne tylko w przypadku bloków propagacji, które pochodzą z source_block |
propagate_output_messages | Propagacja komunikatów do elementów docelowych. |
propagate_to_any_targets | Po zastąpieniu w klasie pochodnej propaguje dany komunikat do dowolnych lub wszystkich połączonych obiektów docelowych. Jest to główna rutyna propagacji bloków komunikatów. |
release_message | Po zastąpieniu w klasie pochodnej zwalnia poprzednią rezerwację komunikatów. |
remove_targets | Usuwa wszystkie łącza docelowe dla tego bloku źródłowego. Należy to wywołać z destruktora. |
reserve_message | Po zastąpieniu w klasie pochodnej rezerwuje komunikat wcześniej oferowany przez ten source_block obiekt. |
resume_propagation | Po zastąpieniu klasy pochodnej propagacja jest wznawiana po wydaniu rezerwacji. |
sync_send | Synchronicznie kolejkuje komunikaty i uruchamia zadanie propagacji, jeśli jeszcze tego nie zrobiono. |
unlink_target_notification | Wywołanie zwrotne, które powiadamia, że obiekt docelowy został odłączony od tego source_block obiektu. |
wait_for_outstanding_async_sends | Czeka na ukończenie wszystkich propagacji asynchronicznych. To oczekiwanie spin specyficzne dla propagatora jest używane w destruktorach bloków komunikatów, aby upewnić się, że wszystkie propagacje asynchroniczne mają czas na zakończenie przed zniszczeniem bloku. |
Uwagi
Bloki komunikatów powinny pochodzić z tego bloku, aby korzystać z zarządzania linkami i synchronizacji dostarczonej przez tę klasę.
Hierarchia dziedziczenia
source_block
Wymagania
Nagłówek: agents.h
Przestrzeń nazw: współbieżność
akceptuj
Akceptuje komunikat oferowany przez ten source_block
obiekt, przenosząc własność do obiektu wywołującego.
virtual message<_Target_type>* accept(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
Parametry
_MsgId
Obiekt runtime_object_identity
oferowany message
.
_PTarget
Wskaźnik do bloku docelowego wywołującego metodę accept
.
Wartość zwracana
Wskaźnik do message
obiektu, którego obiekt wywołujący ma teraz własność.
Uwagi
Metoda zgłasza wyjątek invalid_argument, jeśli parametr ma wartość NULL
_PTarget
.
Metoda jest wywoływana accept
przez element docelowy, gdy komunikat jest oferowany przez ten ISource
blok. Zwrócony wskaźnik komunikatu może różnić się od tego, który został przekazany do propagate
metody ITarget
bloku, jeśli to źródło zdecyduje się utworzyć kopię komunikatu.
accept_message
Po zastąpieniu w klasie pochodnej akceptuje oferowany komunikat przez źródło. Bloki komunikatów powinny zastąpić tę metodę, aby zweryfikować _MsgId
i zwrócić komunikat.
virtual message<_Target_type>* accept_message(runtime_object_identity _MsgId) = 0;
Parametry
_MsgId
Tożsamość obiektu środowiska uruchomieniowego message
obiektu.
Wartość zwracana
Wskaźnik do komunikatu, że obiekt wywołujący ma teraz własność.
Uwagi
Aby przenieść własność, należy zwrócić oryginalny wskaźnik komunikatu. Aby zachować własność, należy wykonać i zwrócić kopię ładunku komunikatu.
acquire_ref
Uzyskuje liczbę odwołań dla tego source_block
obiektu, aby zapobiec usunięciu.
virtual void acquire_ref(_Inout_ ITarget<_Target_type> *);
Uwagi
Ta metoda jest wywoływana przez ITarget
obiekt połączony z tym źródłem podczas link_target
metody .
async_send
Asynchronicznie kolejkuje komunikaty i uruchamia zadanie propagacji, jeśli jeszcze tego nie zrobiono
virtual void async_send(_Inout_opt_ message<_Target_type>* _Msg);
Parametry
_Msg
Wskaźnik do message
obiektu do asynchronicznego wysyłania.
consume
Używa komunikatu oferowanego wcześniej przez ten source_block
obiekt i pomyślnie zarezerwowanego przez obiekt docelowy, przenosząc własność do obiektu wywołującego.
virtual message<_Target_type>* consume(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
Parametry
_MsgId
Obiekt runtime_object_identity
zarezerwowany message
.
_PTarget
Wskaźnik do bloku docelowego wywołującego metodę consume
.
Wartość zwracana
Wskaźnik do message
obiektu, którego obiekt wywołujący ma teraz własność.
Uwagi
Metoda zgłasza wyjątek invalid_argument, jeśli parametr ma wartość NULL
_PTarget
.
Metoda zgłasza wyjątek bad_target , jeśli parametr _PTarget
nie reprezentuje obiektu docelowego o nazwie reserve
.
Metoda jest podobna consume
do accept
metody , ale zawsze musi być poprzedzona wywołaniem metody , która reserve
zwróciła true
wartość .
consume_message
Po zastąpieniu w klasie pochodnej używa komunikatu, który był wcześniej zarezerwowany.
virtual message<_Target_type>* consume_message(runtime_object_identity _MsgId) = 0;
Parametry
_MsgId
Obiekt runtime_object_identity
, który message
jest używany.
Wartość zwracana
Wskaźnik do komunikatu, że obiekt wywołujący ma teraz własność.
Uwagi
Podobnie jak accept
element , ale zawsze jest poprzedzony wywołaniem metody reserve
.
enable_batched_processing
Włącza przetwarzanie wsadowe dla tego bloku.
void enable_batched_processing();
initialize_source
Inicjuje element message_propagator
w tym source_block
obiekcie .
void initialize_source(
_Inout_opt_ Scheduler* _PScheduler = NULL,
_Inout_opt_ ScheduleGroup* _PScheduleGroup = NULL);
Parametry
_PScheduler
Harmonogram, który ma być używany do planowania zadań.
_PScheduleGroup
Grupa harmonogramu, która ma być używana do planowania zadań.
link_target
Łączy blok docelowy z tym source_block
obiektem.
virtual void link_target(_Inout_ ITarget<_Target_type>* _PTarget);
Parametry
_PTarget
Wskaźnik do bloku, aby połączyć się z tym source_block
obiektemITarget
.
Uwagi
Metoda zgłasza wyjątek invalid_argument, jeśli parametr ma wartość NULL
_PTarget
.
link_target_notification
Wywołanie zwrotne, które powiadamia o tym, że nowy obiekt docelowy został połączony z tym source_block
obiektem.
virtual void link_target_notification(_Inout_ ITarget<_Target_type> *);
process_input_messages
Przetwarzanie komunikatów wejściowych. Jest to przydatne tylko w przypadku bloków propagacji, które pochodzą z source_block
virtual void process_input_messages(_Inout_ message<_Target_type>* _PMessage);
Parametry
_PMessage
Wskaźnik do komunikatu, który ma zostać przetworzony.
propagate_output_messages
Propagacja komunikatów do elementów docelowych.
virtual void propagate_output_messages();
propagate_to_any_targets
Po zastąpieniu w klasie pochodnej propaguje dany komunikat do dowolnych lub wszystkich połączonych obiektów docelowych. Jest to główna rutyna propagacji bloków komunikatów.
virtual void propagate_to_any_targets(_Inout_opt_ message<_Target_type>* _PMessage);
Parametry
_PMessage
Wskaźnik do komunikatu, który ma zostać rozpropagowany.
zwolnić
Zwalnia poprzednią pomyślną rezerwację komunikatów.
virtual void release(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
Parametry
_MsgId
Obiekt runtime_object_identity
zarezerwowany message
.
_PTarget
Wskaźnik do bloku docelowego wywołującego metodę release
.
Uwagi
Metoda zgłasza wyjątek invalid_argument, jeśli parametr ma wartość NULL
_PTarget
.
Metoda zgłasza wyjątek bad_target , jeśli parametr _PTarget
nie reprezentuje obiektu docelowego o nazwie reserve
.
release_message
Po zastąpieniu w klasie pochodnej zwalnia poprzednią rezerwację komunikatów.
virtual void release_message(runtime_object_identity _MsgId) = 0;
Parametry
_MsgId
message
Obiektruntime_object_identity
, który jest zwalniany.
release_ref
Zwalnia liczbę odwołań dla tego source_block
obiektu.
virtual void release_ref(_Inout_ ITarget<_Target_type>* _PTarget);
Parametry
_PTarget
Wskaźnik do bloku docelowego wywołującego tę metodę.
Uwagi
Ta metoda jest wywoływana przez ITarget
obiekt, który jest odłączony od tego źródła. Blok źródłowy może zwolnić wszystkie zasoby zarezerwowane dla bloku docelowego.
remove_targets
Usuwa wszystkie łącza docelowe dla tego bloku źródłowego. Należy to wywołać z destruktora.
void remove_targets();
rezerwować
Rezerwuje komunikat wcześniej oferowany przez ten source_block
obiekt.
virtual bool reserve(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
Parametry
_MsgId
Obiekt runtime_object_identity
oferowany message
.
_PTarget
Wskaźnik do bloku docelowego wywołującego metodę reserve
.
Wartość zwracana
true
jeśli wiadomość została pomyślnie zarezerwowana, false
w przeciwnym razie. Rezerwacje mogą zakończyć się niepowodzeniem z wielu powodów, w tym: komunikat został już zarezerwowany lub zaakceptowany przez inny obiekt docelowy, źródło może odmówić rezerwacji itd.
Uwagi
Metoda zgłasza wyjątek invalid_argument, jeśli parametr ma wartość NULL
_PTarget
.
Po wywołaniu reserve
metody , jeśli się powiedzie, musisz zadzwonić consume
do lub release
w celu podjęcia lub rezygnacji z posiadania wiadomości, odpowiednio.
reserve_message
Po zastąpieniu w klasie pochodnej rezerwuje komunikat wcześniej oferowany przez ten source_block
obiekt.
virtual bool reserve_message(runtime_object_identity _MsgId) = 0;
Parametry
_MsgId
Obiekt runtime_object_identity
message
, który jest zarezerwowany.
Wartość zwracana
true
jeśli wiadomość została pomyślnie zarezerwowana, false
w przeciwnym razie.
Uwagi
Po reserve
wywołaniu metody , jeśli zwraca true
wartość , consume
albo release
musi zostać wywołana, aby przejąć lub zwolnić własność komunikatu.
resume_propagation
Po zastąpieniu klasy pochodnej propagacja jest wznawiana po wydaniu rezerwacji.
virtual void resume_propagation() = 0;
source_block
source_block
Tworzy obiekt.
source_block();
~source_block
source_block
Niszczy obiekt.
virtual ~source_block();
sync_send
Synchronicznie kolejkuje komunikaty i uruchamia zadanie propagacji, jeśli jeszcze tego nie zrobiono.
virtual void sync_send(_Inout_opt_ message<_Target_type>* _Msg);
Parametry
_Msg
Wskaźnik do message
obiektu do synchronicznego wysyłania.
unlink_target
Odłącza blok docelowy od tego source_block
obiektu.
virtual void unlink_target(_Inout_ ITarget<_Target_type>* _PTarget);
Parametry
_PTarget
Wskaźnik do ITarget
bloku, aby odłączyć się od tego source_block
obiektu.
Uwagi
Metoda zgłasza wyjątek invalid_argument, jeśli parametr ma wartość NULL
_PTarget
.
unlink_target_notification
Wywołanie zwrotne, które powiadamia, że obiekt docelowy został odłączony od tego source_block
obiektu.
virtual void unlink_target_notification(_Inout_ ITarget<_Target_type>* _PTarget);
Parametry
_PTarget
Blok ITarget
, który został odłączony.
unlink_targets
Odłącza wszystkie bloki docelowe z tego source_block
obiektu.
virtual void unlink_targets();
wait_for_outstanding_async_sends
Czeka na ukończenie wszystkich propagacji asynchronicznych. To oczekiwanie spin specyficzne dla propagatora jest używane w destruktorach bloków komunikatów, aby upewnić się, że wszystkie propagacje asynchroniczne mają czas na zakończenie przed zniszczeniem bloku.
void wait_for_outstanding_async_sends();