RxCpp系列:(一)第一个程序


安装

 

  ReactiveX/RxCpp: Reactive Extensions for C++ (github.com)

  在github下载源码,源码都是头文件,将 ~/Rx/v2/src/rxcpp 整个目录拷贝到工程目录,应用中包含头文件即可,无需编译库文件。

  

第一个程序

#include <iostream>
#include <thread>
#include <memory>
#include <atomic>
#include <chrono>

#include "rxcpp/rx.hpp"

namespace Rx {
    using namespace rxcpp;
    using namespace rxcpp::sources;
    using namespace rxcpp::operators;
    using namespace rxcpp::util;
    using namespace rxcpp::schedulers;
}
using namespace Rx;

int main(int argc, char const *argv[])
{
    auto keys = observable<>::create<int>(
        [](subscriber<int> dest){
            for (;;) {
                int key = std::cin.get();
                if ('q' == key) {
                    dest.on_completed();
                    break;
                }
                dest.on_next(key);
            }
        });
    
    keys.subscribe([](int key){
            std::cout << "User types key: " << (char)key << std::endl;
        },
        [](){
            std::cout << "User entered 'q' to exit." << std::endl;
        });  

    return 0;
}
main.cpp

附上Makefile

CXXFLAGS += -I./ -std=c++11

SRC := $(wildcard ./*.cpp)
OBJ := $(SRC:%.cpp=%.o)

test_rxcpp: $(OBJ)
    $(CC) -o $@ $^ -lpthread -lm -ldl -lstdc++
    strip $@

all: test_rxcpp

clean:
    @rm -f test_rxcpp
    @rm -f $(OBJ)
    
Makefile

运行结果:

s
User types key: s
User types key: 

g
User types key: g
User types key: 

t
User types key: t
User types key: 

q
User entered 'q' to exit.

  程序只是简单读取用户输入的字符并将它们一个个打印出来,直到用户输入'q',才退出。

  它创建了一个被观察者keys,用于监控用户输入,并将输入数据发送出去,给后级的观察者,这里观察只是简单的打印一下接收到的字符。

  

  这里为啥有字符没打印出来呢?那是个换行符,让我们来滤掉它:

keys.filter([](int key) {
            return key != '\n';
        }).subscribe([](int key){
            std::cout << "User types key: " << (char)key << std::endl;
        },
        [](){
            std::cout << "User entered 'q' to exit." << std::endl;
        });
View Code

运行结果:

sg
User types key: s
User types key: g
r
User types key: r
t
User types key: t
q
User entered 'q' to exit.

  filter是RX中operator中的一种,返回true的数据才会被送到后一级。

  若是有必要,它的后级还可以继续链上其他操作符,这样,数据就从被观察者,流经一系列过滤、转换等操作,最后被观察者所接收。

  这种操作,以及其他operator我们将在后面的学习中接触到。

  

  初接触这种编程方式,可能会一时难以适应。但没关系,学习新东西总有这么个过程。

  网络上找到的关于RxCpp的资料不多,实用的更少,后续尽量多总结一下。

 

  下面的两个链接,感觉对于理解反应性编程帮助挺大的,感谢作者的分享!

  rxcpp - 专题 - 简书 (jianshu.com)

  ReactiveX - 随笔分类 - zwvista - 博客园 (cnblogs.com)

  以及官网文档

  ReactiveX

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM