source_block 類別
source_block
類別是僅限來源區塊的抽象基底類別。 類別會提供基本連結管理功能與常見的錯誤檢查功能。
語法
template<class _TargetLinkRegistry, class _MessageProcessorType = ordered_message_processor<typename _TargetLinkRegistry::type::type>>
class source_block : public ISource<typename _TargetLinkRegistry::type::type>;
參數
_TargetLinkRegistry
用來持有目標連結的連結登錄。
_MessageProcessorType
訊息處理的處理器類型。
成員
公用 Typedefs
名稱 | 描述 |
---|---|
target_iterator |
用來逐步執行已連線目標的反覆運算器。 |
公用建構函式
名稱 | 描述 |
---|---|
source_block | 建構 source_block 物件。 |
~source_block解構函式 | source_block 終結物件。 |
公用方法
名稱 | 描述 |
---|---|
接受 | 接受這個 source_block 物件所提供的訊息,並將擁有權轉移給呼叫端。 |
acquire_ref | 取得這個 source_block 物件的參考計數,以防止刪除。 |
消費 | 取用此 source_block 物件先前提供的訊息,並成功由目標保留,並將擁有權轉移給呼叫端。 |
link_target | 將目標區塊鏈接至這個 source_block 物件。 |
release | 釋放先前成功的訊息保留。 |
release_ref | 釋放這個 source_block 對象的參考計數。 |
reserve | 保留先前由這個 source_block 物件提供的訊息。 |
unlink_target | 從這個 source_block 物件取消連結目標區塊。 |
unlink_targets | 從這個 source_block 物件取消連結所有目標區塊。 (覆寫 ISource::unlink_targets. |
受保護的方法
名稱 | 描述 |
---|---|
accept_message | 在衍生類別中覆寫時,接受來源提供的訊息。 訊息區塊應該覆寫這個方法,以驗證 _MsgId 並傳回訊息。 |
async_send | 如果尚未完成,請以異步方式將訊息排入佇列並啟動傳播工作 |
consume_message | 在衍生類別中覆寫時,會取用先前保留的訊息。 |
enable_batched_processing | 啟用這個區塊的批次處理。 |
initialize_source | message_propagator 初始化這個 source_block 內的 。 |
link_target_notification | 回呼,通知新目標已連結至這個 source_block 物件。 |
process_input_messages | 處理輸入訊息。 這只對衍生自 source_block 的傳播程式區塊有用 |
propagate_output_messages | 將訊息傳播至目標。 |
propagate_to_any_targets | 在衍生類別中覆寫時,將指定的訊息傳播至任何或所有鏈接的目標。 這是訊息區塊的主要傳播例程。 |
release_message | 在衍生類別中覆寫時,釋放先前的訊息保留。 |
remove_targets | 拿掉此來源區塊的所有目標連結。 這應該從解構函式呼叫。 |
reserve_message | 在衍生類別中覆寫時,保留這個 source_block 物件先前提供的訊息。 |
resume_propagation | 在衍生類別中覆寫時,在發行保留之後繼續傳播。 |
sync_send | 如果尚未完成,請同步排入佇列訊息並啟動傳播工作。 |
unlink_target_notification | 回呼,通知目標已從這個 source_block 物件取消連結。 |
wait_for_outstanding_async_sends | 等候所有異步傳播完成。 此傳播器特定的微調等候會用於解構訊息區塊的解構函式中,以確保所有異步傳播在終結區塊之前都有時間完成。 |
備註
訊息區塊應該衍生自此區塊,以利用這個類別所提供的連結管理和同步處理。
繼承階層架構
source_block
需求
標頭: agents.h
命名空間: concurrency
accept
接受這個 source_block
物件所提供的訊息,並將擁有權轉移給呼叫端。
virtual message<_Target_type>* accept(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
參數
_MsgId
runtime_object_identity
提供物件message
的 。
_PTarget
呼叫 方法之目標區塊的 accept
指標。
傳回值
呼叫端現在擁有其擁有權的物件指標 message
。
備註
如果 參數_PTarget
為 NULL
,則方法會擲回invalid_argument例外狀況。
當 accept
此 ISource
區塊提供訊息時,目標會呼叫 方法。 如果此來源決定建立訊息複本,傳回的ITarget
訊息指標可能與傳入propagate
區塊方法的指標不同。
accept_message
在衍生類別中覆寫時,接受來源提供的訊息。 訊息區塊應該覆寫這個方法,以驗證 _MsgId
並傳回訊息。
virtual message<_Target_type>* accept_message(runtime_object_identity _MsgId) = 0;
參數
_MsgId
對象的運行時間對象識別 message
。
傳回值
呼叫端現在擁有其擁有權之訊息的指標。
備註
若要傳輸擁有權,應該傳回原始訊息指標。 若要維護擁有權,必須建立並傳回訊息承載的複本。
acquire_ref
取得這個 source_block
物件的參考計數,以防止刪除。
virtual void acquire_ref(_Inout_ ITarget<_Target_type> *);
備註
這個方法是由 ITarget
在 方法期間 link_target
連結至這個來源的物件所呼叫。
async_send
如果尚未完成,請以異步方式將訊息排入佇列並啟動傳播工作
virtual void async_send(_Inout_opt_ message<_Target_type>* _Msg);
參數
_味精
要異步傳送之 物件的指標 message
。
消耗
取用此 source_block
物件先前提供的訊息,並成功由目標保留,並將擁有權轉移給呼叫端。
virtual message<_Target_type>* consume(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
參數
_MsgId
runtime_object_identity
保留message
物件的 。
_PTarget
呼叫 方法之目標區塊的 consume
指標。
傳回值
呼叫端現在擁有其擁有權的物件指標 message
。
備註
如果 參數_PTarget
為 NULL
,則方法會擲回invalid_argument例外狀況。
如果 參數_PTarget
不代表呼叫 reserve
的目標,此方法會擲回bad_target例外狀況。
方法consume
類似於 accept
,但之前一律必須有傳回true
的 reserve
呼叫。
consume_message
在衍生類別中覆寫時,會取用先前保留的訊息。
virtual message<_Target_type>* consume_message(runtime_object_identity _MsgId) = 0;
參數
_MsgId
runtime_object_identity
message
選擇物件的 。
傳回值
呼叫端現在擁有其擁有權之訊息的指標。
備註
類似於 accept
,但前面一律會呼叫 reserve
。
enable_batched_processing
啟用這個區塊的批次處理。
void enable_batched_processing();
initialize_source
message_propagator
初始化這個 source_block
內的 。
void initialize_source(
_Inout_opt_ Scheduler* _PScheduler = NULL,
_Inout_opt_ ScheduleGroup* _PScheduleGroup = NULL);
參數
_PScheduler
要用於排程工作的排程器。
_PScheduleGroup
要用於排程工作的排程群組。
link_target
將目標區塊鏈接至這個 source_block
物件。
virtual void link_target(_Inout_ ITarget<_Target_type>* _PTarget);
參數
_PTarget
要連結至這個source_block
物件的區塊指標ITarget
。
備註
如果 參數_PTarget
為 NULL
,則方法會擲回invalid_argument例外狀況。
link_target_notification
回呼,通知新目標已連結至這個 source_block
物件。
virtual void link_target_notification(_Inout_ ITarget<_Target_type> *);
process_input_messages
處理輸入訊息。 這只對衍生自 source_block 的傳播程式區塊有用
virtual void process_input_messages(_Inout_ message<_Target_type>* _PMessage);
參數
_PMessage
要處理的訊息指標。
propagate_output_messages
將訊息傳播至目標。
virtual void propagate_output_messages();
propagate_to_any_targets
在衍生類別中覆寫時,將指定的訊息傳播至任何或所有鏈接的目標。 這是訊息區塊的主要傳播例程。
virtual void propagate_to_any_targets(_Inout_opt_ message<_Target_type>* _PMessage);
參數
_PMessage
要傳播之訊息的指標。
版本
釋放先前成功的訊息保留。
virtual void release(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
參數
_MsgId
runtime_object_identity
保留message
物件的 。
_PTarget
呼叫 方法之目標區塊的 release
指標。
備註
如果 參數_PTarget
為 NULL
,則方法會擲回invalid_argument例外狀況。
如果 參數_PTarget
不代表呼叫 reserve
的目標,此方法會擲回bad_target例外狀況。
release_message
在衍生類別中覆寫時,釋放先前的訊息保留。
virtual void release_message(runtime_object_identity _MsgId) = 0;
參數
_MsgId
runtime_object_identity
要釋放之message
物件的 。
release_ref
釋放這個 source_block
對象的參考計數。
virtual void release_ref(_Inout_ ITarget<_Target_type>* _PTarget);
參數
_PTarget
呼叫這個方法之目標區塊的指標。
備註
這個方法是由 ITarget
從這個來源取消連結的物件所呼叫。 允許來源區塊釋放保留給目標區塊的任何資源。
remove_targets
拿掉此來源區塊的所有目標連結。 這應該從解構函式呼叫。
void remove_targets();
reserve
保留先前由這個 source_block
物件提供的訊息。
virtual bool reserve(
runtime_object_identity _MsgId,
_Inout_ ITarget<_Target_type>* _PTarget);
參數
_MsgId
runtime_object_identity
提供物件message
的 。
_PTarget
呼叫 方法之目標區塊的 reserve
指標。
傳回值
true
如果已成功保留訊息,則為 , false
否則為 。 保留失敗可能有許多原因,包括:訊息已經保留或已由另一個目標接受、來源拒絕保留等等。
備註
如果 參數_PTarget
為 NULL
,則方法會擲回invalid_argument例外狀況。
呼叫 reserve
之後,如果成功,您必須呼叫 consume
或 release
,才能分別取得或放棄訊息的擁有權。
reserve_message
在衍生類別中覆寫時,保留這個 source_block
物件先前提供的訊息。
virtual bool reserve_message(runtime_object_identity _MsgId) = 0;
參數
_MsgId
runtime_object_identity
要保留的message
物件的 。
傳回值
true
如果已成功保留訊息,則為 , false
否則為 。
備註
呼叫 之後 reserve
,如果傳回 true
, consume
則必須呼叫 或 release
以取得或釋放訊息的擁有權。
resume_propagation
在衍生類別中覆寫時,在發行保留之後繼續傳播。
virtual void resume_propagation() = 0;
source_block
建構 source_block
物件。
source_block();
~source_block
source_block
終結物件。
virtual ~source_block();
sync_send
如果尚未完成,請同步排入佇列訊息並啟動傳播工作。
virtual void sync_send(_Inout_opt_ message<_Target_type>* _Msg);
參數
_味精
要同步傳送之物件的指標 message
。
unlink_target
從這個 source_block
物件取消連結目標區塊。
virtual void unlink_target(_Inout_ ITarget<_Target_type>* _PTarget);
參數
_PTarget
要從這個source_block
物件取消連結之區塊的ITarget
指標。
備註
如果 參數_PTarget
為 NULL
,則方法會擲回invalid_argument例外狀況。
unlink_target_notification
回呼,通知目標已從這個 source_block
物件取消連結。
virtual void unlink_target_notification(_Inout_ ITarget<_Target_type>* _PTarget);
參數
_PTarget
ITarget
未連結的區塊。
unlink_targets
從這個 source_block
物件取消連結所有目標區塊。
virtual void unlink_targets();
wait_for_outstanding_async_sends
等候所有異步傳播完成。 此傳播器特定的微調等候會用於解構訊息區塊的解構函式中,以確保所有異步傳播在終結區塊之前都有時間完成。
void wait_for_outstanding_async_sends();