CAF(C++ actor framework)使用隨筆(使用類去構建actor和使用的一些思路)


Class-based actors
A class-based actor is a subtype of event_based_actor and must implement the pure virtual member function make_behavior returning the initial behavior.

原話告訴我們兩點:1.必須繼承“ event_based_actor”。

                             2.重載make_behavior的函數,其實就是這個類的構造函數,定義了這個初始行為。

關於第一點呢,說明這個類可以使用很多基本的send,看了一點點源碼發現event_based_actor間接繼承了一個叫 localactor 的類,關於這個以類為基礎構造的actor的用法可以去里面找,還是很方便的。

關於第二點,比較簡單,就是要注意,以函數來構造的actor,會傳入參數,但是這個main_behavior是不用參數的。

第二點帶來的問題,就是函數構造的actor發送給自己消息只需要self來只待自己,如

  

self ->send(self,"hello");

 現在不行了,自己就想到一種辦法就是在類內聲明一個scoped_actor,發送給this指針(在本地發送應該是用指針的)。

#include <string>
#include <iostream>
#include "caf/io/all.hpp"
#include "caf/all.hpp"
using namespace std;
using namespace caf;

class SlaveNodeActor : public event_based_actor {
 public:
  behavior make_behavior() override {
 scoped_actor a; a->send(this,"hello"); return {
        [=](const string& str ) {
          cout << str << endl;
          quit();
        },
        caf::others >> [=]() {
         cout << "unkown message" << endl; 
       } 
    };
  }
};

int main(){
  auto slave_actor = caf::spawn<SlaveNodeActor>();
  caf::await_all_actors_done();
  return 0;
}

然后,最近寫代碼發現這樣一種用法,就是類A存放這actor的信息如IP,端口號,以及這個actor本身的信息,作為一個人就需要姓名,而類B繼承了event_based_actor,作為類A的友元類去調用A的信息,B的構造函數需要傳入一個類A的指針即可,A負責對外提供接口控制actor的行為。

貼個圖片

 

為了方便控制,類A(SlaveNode 最好好把actor作為自己的成員變量,不然使用的時候會不方便,用了就知道,你懂得。)

 

之后又試了一下,其實可以把上面生成scoped_actor 去掉,

直接用

這樣也是可以的,功能都是一樣的。(之前有些粗糙誤導了)

 

最后弱弱的說一句,求互粉阿!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM