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();