鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    如何实现client端发送service后获取response超时的逻辑(非阻塞)

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    ros2通信 service timeout
    2
    6
    608
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • S
      siceanfly
      最后由 编辑

      有一个业务模块会给多个service发送请求,需要收到各个模块service的response来判断整个系统是正常工作的,然后进行下一步。如何实现超时逻辑,查到有个api是spin_until_future_complete,这个api是阻塞的,不符合要求。如果起timer来判断到时间后future是否有结果,这样写代码会非常凌乱。是否有优雅的方式来做到?

      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @siceanfly
        最后由 编辑

        @siceanfly 要判断系统每个节点是否正常,可以尝试生命周期节点。不知道你的逻辑里这个业务模块是如何触发的

        新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

        S 1 条回复 最后回复 回复 引用 0
        • S
          siceanfly @小鱼
          最后由 编辑

          @小鱼 有生命周期的判断,还要判断下这次调用是否超时,有些service会两分钟后才有response,这种情况是要报错的

          小鱼小 1 条回复 最后回复 回复 引用 0
          • 小鱼小
            小鱼 技术大佬 @siceanfly
            最后由 编辑

            @siceanfly 在服务的回调函数里写标志,然后在用的 地方等待或者判断这个标志

            新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

            S 1 条回复 最后回复 回复 引用 0
            • S
              siceanfly @小鱼
              最后由 编辑

              @小鱼 可能我没描述清楚,比如我发了一个nodeA里给nodeB发了一个叫/add_two_ints的service,结果nodeB1分钟后才返回我response,我希望如果nodeA发现10秒钟没有收到就打一个超时log,但是我不想发送的时候还起一个timer,有接口可以设timeout的参数,同时不阻塞nodeA的办法吗?

              小鱼小 1 条回复 最后回复 回复 引用 0
              • 小鱼小
                小鱼 技术大佬 @siceanfly
                最后由 编辑

                @siceanfly 没有比较好的办法,不堵塞到是有,使用多线程回调组就可以了,除此之外使用timer其时也挺好的,定时一次就取消就行,检测完就停下来。
                一次性发送多个服务可以全部发送异步的 auto future = client->async_send_request(my_request); ,然后将future存下,10s后检测future状态就可以进行处理了。

                新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                1 条回复 最后回复 回复 引用 0
                • 第一个帖子
                  最后一个帖子
                皖ICP备16016415号-7
                Powered by NodeBB | 鱼香ROS