首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用rxcpp调度和超时处理

用rxcpp调度和超时处理
EN

Stack Overflow用户
提问于 2015-09-23 12:00:01
回答 2查看 1.5K关注 0票数 3

我刚开始使用rxcpp并尝试在以下场景中实现功能:

我有一个数据源将从单独的源代码中检索命令,我正在编写的代码将将这些命令检索到一个可观察的rxcpp中。它的特殊条件是,如果在一定时间内没有收到任何命令,订阅者onError函数将被运行而不是onNext,但是超时只能在接收第一个命令之前发生。在接收到第一个命令之后,无论接收任何进一步的命令需要多长时间,超时都不会发生。

我试着用这样的方法来完成这件事:

代码语言:javascript
复制
auto timeout = rxcpp::observable<>::timer(std::chrono::steady_clock::now() + timeout,
                             rxcpp::observe_on_event_loop()).map([](int val) // Note, converts the value type of the timer observable and converts timeouts to errors
{
    std::cout << "TIMED OUT!" << std::endl;
    throw std::runtime_error("timeout");
    return command_type();
});
auto commands = timeout.amb(rxcpp::observe_on_event_loop(), createCommandSource(event_loop_scheduler, ...));

我遇到的问题是,超时发生在收到任何命令之前,即使它们在超时发生之前就被插入了。我试过从1000到5000毫秒的超时,这并没有什么区别。但是,如果删除超时代码,则会立即收到命令。不过,我怀疑我可能只是误解了如何在rxcpp中使用调度器,所以我想知道这是如何实现的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-26 05:30:43

我写了一个简单的createCommandSource。这对我起了作用:

代码语言:javascript
复制
#include "rxcpp/rx.hpp"
using namespace rxcpp;
using namespace rxcpp::sources;
using namespace rxcpp::util;

using namespace std;

struct command_type {};

int main()
{
    auto eventloop = rxcpp::observe_on_event_loop();
    auto createCommandSource = [=]() {
        return rxcpp::observable<>::interval(std::chrono::seconds(1), eventloop).map([](long) {return command_type(); });
    };
    auto timeout = rxcpp::observable<>::timer(eventloop.now() + std::chrono::seconds(2), eventloop).map([](long ) // Note, converts the value type of the timer observable and converts timeouts to errors
    {
        std::cout << "TIMED OUT!" << std::endl;
        throw std::runtime_error("timeout");
        return command_type();
    });
    auto commands = timeout.amb(eventloop, createCommandSource().take(5));

    commands
        .as_blocking().subscribe(
        [](command_type) {printf("command\n"); },
        [](std::exception_ptr) {printf("execption\n"); });

    std::this_thread::sleep_for(std::chrono::seconds(2));

    return 0;
}
票数 3
EN

Stack Overflow用户

发布于 2019-02-07 10:51:57

现在,为了管理超时,可以使用.timeout()操作符提供间隔持续时间作为参数,如下所示:

代码语言:javascript
复制
createCommandSource(event_loop_scheduler, ...).timeout((std::chrono::seconds(2));

据我所知,这个操作符确保在创建流和第一个命令、任何一对命令之间以及在命令流的最后一个命令和on_complete()事件之间超时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32739021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档