【问题标题】:Accessing other threads or data from POCO HTTPRequestHandler从 POCO HTTPRequestHandler 访问其他线程或数据
【发布时间】:2015-07-15 04:59:48
【问题描述】:

我有一个 C++ 应用程序,它可以读取各种传感器,然后根据需要对它们进行操作。目前,传感器在自己的线程中运行,并为其值提供 get/set 方法。

我正在尝试使用 POCO 库集成 Web 套接字服务器以显示传感器的状态。

如何将传感器信息输入 HTTPRequestHandler?

我应该使用 POCO::Application 类并将传感器和服务器定义为子系统吗?我应该采取其他方法吗?

【问题讨论】:

    标签: c++ multithreading websocket poco-libraries


    【解决方案1】:

    您可以从HTTPRequestHandler 派生并覆盖handleRequest(),并通过例如将传感器信息对象的引用存储为从HTTPRequestHandler 派生的类的成员来访问传感器信息。

    class SensorStateRequestHandler : public Poco::Net::HTTPRequestHandler
    {
    public:
        SensorStateRequestHandler(SensorInfo &sensorInfo)
            : sensorInfo_(sensorInfo)
        {}
    
        virtual void handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response) override
        {
            // receive request websocket frame
            sensorInfo_.get_state(); // must be thread safe
            // send response websocket frame with sensor state
        }
    
    private:
        sensorInfo &sensorInfo_;
    };
    

    【讨论】:

    • 这将起作用,但它不会扩展,因为客户端必须不断地轮询新数据,并且每个数据请求都会占用一个线程(尽管可能是短暂的);此外,根据新数据的频率,可能会在没有新数据可用时启动许多线程。有关 pub/sub 类型的解决方案,请参阅我的答案。
    【解决方案2】:

    了解macchina.io 中的WebEventService 是如何实现的——使用 Poco::Net::HTTPServer、WebSocket 和 Poco::NotificationQueue。

    “简而言之”的设计是一种发布/订阅模式,客户端订阅通知并通过 WebSocket 接收通知; in-process subscriptions/notifications(使用 Poco 事件)也受支持。订阅时启动了一个短期线程 (HTTP handler),其余通信通过 WebSocket reactor-like 功能进行,因此性能和可扩展性相当不错(尽管还有改进的空间,具体取决于目标平台) .

    您可以考虑使用 macchina.io 本身(Apache 许可证) - 它基于 POCO/OSP 并针对您拥有的应用程序类型。 WebEvent 功能将成为 1.7.0 版本中Poco::NetEx 的一部分(计划于今年 9 月发布)。

    【讨论】:

    • 感谢您的建议。我看过 macchina.io 但不知道从哪里开始。这是一个在 BeagleBone Black 上运行的相对简单的 uni 项目,所以 macchina.io 可能有点过头了。到目前为止,我发现 POCO 相当容易使用(对于没有太多 C++ 经验的人)
    • 没问题。如果您想使用 WebSockets,请参阅 WebNotifier 示例 - 它演示了如何在 DB 数据更改时将数据从 SQLite DB 推送(无轮询)到 WebSocket 客户端。
    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    相关资源
    最近更新 更多