gpt4 book ai didi

c++ - 使用 rxcpp 进行调度和超时处理

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:26 33 4
gpt4 key购买 nike

我刚开始使用 rxcpp 并尝试在以下情况下将某些功能组合在一起:

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

我正在尝试用这样的东西来完成这个:

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 中使用调度程序,所以我想知道如何实现这一点。

最佳答案

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

#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;
}

关于c++ - 使用 rxcpp 进行调度和超时处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32739021/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com