CAF(C++ actor framework)使用随笔(各种send通信用法)(三)

c). 同步发送, 等待响应, 超时后收到1个系统消息.

贴上代码

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

behavior fun(event_based_actor* self){
    return {
        [self](const string& str, const actor &buddy)->string {
            aout(self)<<str<<endl;
            //self->delayed_send(buddy,std::chrono::milliseconds(10),"I‘m lated");
            //std::this_thread::sleep_for(std::chrono::seconds(1));
            //usleep(10000);
            while(1);
            return "log";
            self->quit();
         }
    };
}

void fun1(event_based_actor* self, const actor &buddy){
    self->sync_send(buddy,"hi!",self).then(
         [=](const string& str) {
             aout(self)<<str<<endl;
         },
         after(std::chrono::milliseconds(1))>>[&](){
            aout(self)<<"timeout!"<<endl;
         }
    );
    aout(self)<<"i‘m not waiting for you!"<<endl;
}

int main(){
    auto actor1 = spawn(fun);
    auto actor2 = spawn(fun1,actor1);
    caf::await_all_actors_done();
    shutdown();
    return 0;
}

其中自己试了几种线程休息的几种方法,发现usleep和 C++11自己提供的线程休眠库会导致coredump并且输出一堆东西,可能是caf自己的东西没有去深究等,

还有就是delay_send我也一开始有点傻,想用delay_send去回复发过来的消息,所以传入了actor,但是要搞清楚“发送”和“回复”是两种东西,你不能用发送来回复,只能用return来回复

d). 同步发送, 同步等待. 适用阻塞的actor api.

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

behavior fun(event_based_actor* self){
    return {
        [self](const string& str)->string {
            aout(self)<<str<<endl;
            return "I got it.";
            //self->quit();
         }
    };
}

void fun1(blocking_actor* self, actor buddy){
    self->sync_send(buddy,"hi!").await(
         [=](const string& str) {
             aout(self)<<str<<endl;
         },
         after(std::chrono::milliseconds(1))>>[&](){
            aout(self)<<"timeout!"<<endl;
         }
    );
    aout(self)<<"i‘m not waiting for you!"<<endl;
}

int main(){
    auto actor1 = spawn(fun);
    auto actor2 = spawn<blocking_api>(fun1,actor1);
    caf::await_all_actors_done();
    shutdown();
    return 0;
}

结果(顺序变了)为

唯一修改就是spawn那边加上类型。

自己写了一个很简陋的聊天 传文件的程序,有兴趣可以看一下,维护好友列表,心跳机制都是用caf实现,当时没有用caf的序列话 用的是boost库的。

https://github.com/zhejiangxiaomai/chat

时间: 2024-10-26 06:03:48

CAF(C++ actor framework)使用随笔(各种send通信用法)(三)的相关文章

CAF(C++ actor framework)使用随笔(使用类去构建actor和使用的一些思路)

Class-based actorsA 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的函数,其实就是这个类的构造函数,定义了这个初始行为

CAF(C++ actor framework)使用随笔(projection 用法)(一)

最近干活在写毕设,用到了CAF,看了文档,发现了一些小坑,自己摸索写点随笔.(CAF的github网站 https://github.com/actor-framework/actor-framework)里面的example文件夹例子不错. 但是感觉其实实际使用还是会有很多没讲到. 概念的东西可以看http://www.wfuyu.com/mvc/21278.html 我学习就看着http://www.actor-framework.org/manual/看下去看着不太会的就写例子,第一个坑就

CAF(C++ actor framework)使用随笔(延迟发送,消息转发,消息优先级)(四)

e). 消息延迟发送(和前面没太大区别直接上代码) #include <iostream> #include "caf/all.hpp" #include "caf/io/all.hpp" #include <string> #include <chrono> using namespace std; using namespace caf; behavior fun(event_based_actor* self){ retur

CAF(C++ actor framework)使用随笔(unbecome与keep_behavior用法)

看usermanual(使用随笔一里面有)看到差不多一半的时候,这个keep_behavior与unbeacome的结合引起了我的注意.(这是为什么呢?) 因为它的示例代码写的太简单了!我真的没看太懂,我就自己把他的改了改放上来. 先讲一下,基本概念,就是一个actor可以有多个行为(behavior)那么become就可以让一个actor变成一种行为. 如果使用了keep_behavior呢就会把当前的行为压入“行为栈”(behavior stack),  调用unbecome就可以变成行为栈

CAF(C++ actor framework)(序列化之类,无需序列化,直接传)(二)

昨天讲了Struct,还是不够满意,毕竟C++里面类用的比较多嘛,那就先上个类,这段代码是我稍微改编了一下的结果. #include <utility> #include <iostream> #include <vector> #include "caf/all.hpp" using std::cout; using std::endl; using std::make_pair; using std::vector; using namespac

“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】

刘德华 有一首歌叫<马桶>,其中有一句歌词是:每一个马桶都是英雄. EFCore也有一个英雄,在幕后默默地任劳任怨.它就叫 "支持字段" (Backing Fields): 中文版:https://docs.microsoft.com/zh-cn/ef/core/modeling/backing-field 支持字段允许 EF 读取和/或写入字段而不是一个属性. 在类中的封装用于限制的使用和/或增强围绕访问数据的语义由应用程序代码,但值应进行读取和/或写入到数据库而无需使用

ajax的异步,与send的用法

xhr = new XMLHttpRequest(); xhr.open("get", "01list.ashx", true) xhr.setRequestHeader("If-Modeified-Since", 0); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { var  res= xhr.resp

用actor model实现intel tbb这样的用法

关于什么事actor model,什么事intel tbb这样的用法我就不详细说了,具体请上网查文档 class MyActor { F f; MyActor inputs[]; MyActor outputs[]; int n; #internal void run() { f(); for o in outputs: sendMsg(o, this) } ##1 void addOutput(o) { outputs.append(o); } ##2 void onFirstRun() {

生成器send的用法案例

生成器函数send方法案例:每输入一个值,求移动平均值,如下:10 20 30 40 50...10 15 20 25 30... def avg_creater(): num = 0 count = 0 avg = 0 while True: num1 = yield avg num += num1 count += 1 avg = num/count g = avg_creater() g.__next__() avg = g.send(10) avg = g.send(20) avg =