• 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 去掉,

    直接用

    这样也是可以的,功能都是一样的。(之前有些粗糙误导了)

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

  • 相关阅读:
    SpringMVC常用注解
    SpringMVC基础知识
    如何在git中恢复先前的提交?
    git pull 和git fetch的区别
    webpack和gulp的比较
    SpringMVC框架
    Spring框架
    为什么要在一个团队中开展软件测试工作?
    需求测试的注意事项有哪些?
    主键、外键的作用,索引的优点与不足?
  • 原文地址:https://www.cnblogs.com/zhejiangxiaomai/p/5257057.html
Copyright © 2020-2023  润新知