You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在main函数中访问WebToolkit的WebApp类以填充数据?

解决方案:在Wt中访问WebApp实例的传感器容器

Wt的运行机制是由Wt::WRun管理用户会话,每个会话会调用createApplication创建独立的WebApp实例,因此main函数无法直接持有或访问WebApp实例。可以通过以下几种方式实现传感器数据的传递或访问:


方法一:在WebApp构造时传入初始化的传感器数据

修改WebApp的构造函数,让它接收传感器数据,在createApplication中完成数据初始化并传递给实例。

1. 修改WebApp头文件

// View/WebApp.h
#include <Wt/WApplication.h>
#include <vector>
#include <memory> // 用于智能指针管理内存
#include "OxygenSensor.h"

class WebApp : public Wt::WApplication {
public:
    // 构造函数新增传感器参数
    WebApp(const Wt::WEnvironment& env, const std::vector<std::unique_ptr<OxygenSensor>>& sensors);

    // 改用智能指针避免内存泄漏
    std::vector<std::unique_ptr<OxygenSensor>> OSList;
    // 其他成员...
};

2. 实现WebApp构造函数

// View/WebApp.cpp
#include "WebApp.h"

WebApp::WebApp(const Wt::WEnvironment& env, const std::vector<std::unique_ptr<OxygenSensor>>& sensors)
    : Wt::WApplication(env), OSList(sensors) {
    // 初始化UI或其他逻辑
}

3. 修改main函数及createApplication

#include <Wt/WApplication.h>
#include <vector>
#include <string>
#include <memory>
#include <thread>
#include "View/WebApp.h"
#include "OxygenSensor.h"

std::vector<std::string> make_webapp_config();

// 初始化传感器数据
std::vector<std::unique_ptr<OxygenSensor>> init_sensors() {
    std::vector<std::unique_ptr<OxygenSensor>> sensors;
    sensors.emplace_back(std::make_unique<OxygenSensor>("氧气传感器1"));
    sensors.emplace_back(std::make_unique<OxygenSensor>("氧气传感器2"));
    return sensors;
}

// 修改createApplication,接收传感器数据
std::unique_ptr<Wt::WApplication> create_app(const Wt::WEnvironment& env, const std::vector<std::unique_ptr<OxygenSensor>>& sensors) {
    return std::make_unique<WebApp>(env, sensors);
}

int main(int argc, char **argv) {
    auto sensors = init_sensors();

    // 用lambda捕获传感器数据,传递给Wt的应用创建器
    auto app_creator = [sensors = std::move(sensors)](const Wt::WEnvironment& env) {
        return create_app(env, sensors);
    };

    return Wt::WRun(argv[0], make_webapp_config(), app_creator);
}

std::vector<std::string> make_webapp_config() {
  std::vector<std::string> conf;
  conf.push_back("--docroot");
  conf.push_back(".");
  conf.push_back("--http-address");
  conf.push_back("0.0.0.0");
  conf.push_back("--http-port");
  conf.push_back("9090");
  return conf;
}

方法二:给WebApp添加公共接口,动态添加传感器

如果需要在程序运行时(比如传感器实时更新)向WebApp实例添加数据,可以给WebApp添加公共方法,通过Wt的会话实例接口获取当前应用实例并操作。

1. 给WebApp添加公共方法

// View/WebApp.h
class WebApp : public Wt::WApplication {
public:
    // ... 构造函数及其他成员
    void add_oxygen_sensor(std::unique_ptr<OxygenSensor> sensor) {
        OSList.push_back(std::move(sensor));
        // 触发UI更新(如果需要)
        triggerUpdate();
    }
};

2. 在main中动态传递数据(需注意线程安全)

#include <Wt/WServer.h>
#include <chrono>

int main(int argc, char **argv) {
    Wt::WServer server(argv[0], make_webapp_config());
    server.setServerConfiguration(argc, argv, false);
    server.addEntryPoint(Wt::EntryPointType::Application, createApplication);

    // 启动服务器
    server.start();

    // 模拟传感器数据收集线程
    std::thread sensor_thread([&server]() {
        int count = 0;
        while (server.isRunning()) {
            // 创建新传感器数据
            auto new_sensor = std::make_unique<OxygenSensor>(std::string("动态传感器") + std::to_string(++count));

            // 将操作投递到Wt的UI线程(避免线程安全问题)
            server.postAll([sensor = std::move(new_sensor)]() {
                auto app = dynamic_cast<WebApp*>(Wt::WApplication::instance());
                if (app) {
                    app->add_oxygen_sensor(std::move(sensor));
                }
            });

            std::this_thread::sleep_for(std::chrono::seconds(5));
        }
    });

    // 等待服务器停止
    server.waitForShutdown();
    sensor_thread.join();

    return 0;
}

关键注意事项

  • 内存管理:优先使用std::unique_ptr或std::shared_ptr管理传感器实例,避免内存泄漏。
  • 线程安全:Wt的UI操作必须在主线程执行,跨线程操作需通过WServer::post/postAll投递到UI线程。
  • 会话隔离:每个用户会话对应独立的WebApp实例,如果需要所有会话共享传感器数据,建议使用全局数据源,让WebApp主动读取而非维护各自的列表。

内容的提问来源于stack exchange,提问作者Johannes Brunner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:14:59