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 等候所有非同步傳播完成。 此傳播器特定的微調等候會用於解構訊息區塊的解構函式中,以確保所有非同步傳播在終結區塊之前都有時間完成。

備註

訊息區塊應該衍生自此區塊,以利用這個類別所提供的連結管理和同步處理。

繼承階層架構

ISource

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

備註

如果 參數 _PTargetNULL ,則方法會 擲回invalid_argument 例外狀況。

acceptISource 區塊提供訊息時,目標會呼叫 方法。 如果此來源決定建立訊息複本,傳回的 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

備註

如果 參數 _PTargetNULL ,則方法會 擲回invalid_argument 例外狀況。

如果 參數 _PTarget 不代表呼叫 reserve 的目標,此方法會 擲回bad_target 例外狀況。

方法 consume 類似于 accept ,但之前一律必須有傳回 truereserve 呼叫。

consume_message

在衍生類別中覆寫時,會取用先前保留的訊息。

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

參數

_MsgId
runtime_object_identitymessage 所取用物件的 。

傳回值

呼叫端現在擁有其擁有權之訊息的指標。

備註

類似于 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
要用於排程工作的排程群組。

將目標區塊連結至這個 source_block 物件。

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

參數

_PTarget
要連結至這個 source_block 物件的區塊指標 ITarget

備註

如果 參數 _PTargetNULL ,則方法會 擲回invalid_argument 例外狀況。

回呼,通知新目標已連結至這個 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 指標。

備註

如果 參數 _PTargetNULL ,則方法會 擲回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 否則為 。 保留失敗可能有許多原因,包括:訊息已經保留或已由另一個目標接受、來源拒絕保留等等。

備註

如果 參數 _PTargetNULL ,則方法會 擲回invalid_argument 例外狀況。

呼叫 reserve 之後,如果成功,您必須呼叫 consumerelease ,才能分別取得或放棄訊息的擁有權。

reserve_message

在衍生類別中覆寫時,保留這個 source_block 物件先前提供的訊息。

virtual bool reserve_message(runtime_object_identity _MsgId) = 0;

參數

_MsgId
runtime_object_identity要保留之 message 物件的 。

傳回值

true 如果已成功保留訊息,則為 , false 否則為 。

備註

呼叫 之後 reserve ,如果傳回 trueconsume 則必須呼叫 或 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

從這個 source_block 物件取消連結目標區塊。

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

參數

_PTarget
要從這個 source_block 物件取消連結之區塊的 ITarget 指標。

備註

如果 參數 _PTargetNULL ,則方法會 擲回invalid_argument 例外狀況。

回呼,通知目標已從這個 source_block 物件取消連結。

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

參數

_PTarget
ITarget未連結的區塊。

從這個 source_block 物件取消連結所有目標區塊。

virtual void unlink_targets();

wait_for_outstanding_async_sends

等候所有非同步傳播完成。 此傳播器特定的微調等候會用於解構訊息區塊的解構函式中,以確保所有非同步傳播在終結區塊之前都有時間完成。

void wait_for_outstanding_async_sends();

另請參閱

concurrency 命名空間
ISource 類別