c++ - 如何在 wt(c++) 创建后更新网页

标签 c++ wt

我是 wt 的新手,刚开始将 Web 界面添加到一个滞后的 c++ 程序中。 示例 hello_world 工作正常。

然而,给出的示例都是关于创建网页的,并且该页面可以对来自网页的事件(即按钮、复选框)使用react,我想在开始 session 后修改网页​​。更像是 HMI 响应数据的变化,而不是来自 webpake 的按钮。

应该是可行的,正如wt文档所说: 实际的请求处理和呈现是抽象的,其好处是可以根据配置和浏览器属性使用完整页面呈现模型(纯 HTML)或增量更新(Ajax/WebSockets)。

我向 hello_world 添加了一个“updateText”方法:

class HelloApplication : public WApplication 
{
public:
    HelloApplication(const WEnvironment& env);
    void updateText(std::string value); // I add this and rest are from helloworld
private:
    WLineEdit *nameEdit_;
    WText *greeting_;
    void greet();
};

实现如下:

HelloApplication::HelloApplication(const WEnvironment& env)
: WApplication(env) 
{
    setTitle("Trading Platform Status");                               // application title

    root()->addWidget(new WText("Starting... "));  // show some text
    nameEdit_ = new WLineEdit(root());                     // allow text input
    nameEdit_->setFocus();                                 // give focus

    WPushButton *button
        = new WPushButton("Greet me.", root());              // create a button
    button->setMargin(5, Left);                            // add 5 pixels margin

    root()->addWidget(new WBreak());                       // insert a line break

    greeting_ = new WText(root());                         // empty text


    /* Connect signals with slots - simple Wt-way*/
    button->clicked().connect(this, &HelloApplication::greet);

    /* using an arbitrary function object (binding values with boost::bind())*/
    nameEdit_->enterPressed().connect
        (boost::bind(&HelloApplication::greet, this))
}

void HelloApplication::greet() {
    /*Update the text, using text input into the nameEdit_ field.*/
    greeting_->setText("Hello there, " + nameEdit_->text());
}

Greet()来自原来的helloworld,我添加了updateText方法。

void HelloApplication::updateText(std::string value)
{
    /*
    * Update the text, using text input into the nameEdit_ field.
    */
    greeting_->setText(value);
}

WApplication *createApplication(const WEnvironment& env)
{
    /*
    * You could read information from the environment to decide whether
    * the user has permission to start a new application
    */
    return new HelloApplication(env);
}

主要是我在一个单独的线程中启动主机。

手册中指出:

在任何时候,都可以使用静态方法 WApplication::instance() 访问 WApplication 实例,并且对于检查启动参数和设置(使用 WApplication::environment())、设置或更改应用程序标题 (WApplication::setTitle()),指定用于呈现的语言环境 (WApplication::setLocale()),以及许多其他应用程序范围的设置。在多线程环境中,访问该实例是使用线程本地存储实现的。

int main(int argc, char* argv[])
{
    //start in new thread or it blocks the following work
    thread website_thread(&WRun,argc, argv, &createApplication);
    //balabalabala some work
    ((HelloApplication*)WApplication::instance())->updateText("Finished");
    //balabala more work
    return 0
}

updateText 失败,因为“this”为空。显然,这不是完成任务的正确方法。有什么建议吗?

最佳答案

你需要:

  • 维护一个您想要发出信号的 session 列表,例如通过在构造 WApplication 时将 WApplication 对象放入全局列表中,并在析构函数中将其删除。您也可以更细粒度地执行此操作。
  • 为每个可以通过服务器端事件更新的应用程序启用服务器推送(只需调用 WApplication::enableUpdates())
  • 确保在服务器端修改小部件树时锁定它,方法是获取 WApplication::updateLock,或使用 WServer::post() 在 session 上下文中发布函数的执行
  • 当小部件树被修改时调用 WApplication::triggerUpdate(),以便将更改推送到客户端

此外,您可能希望在 wt_config.xml 文件中启用 websockets 支持。

simplechat 示例几乎演示了所有这些。

WApplication::instance 使用线程本地存储,这是在分配线程处理 session 对象时由 Wt 设置的,因此它在主线程中返回 null 是正常的。

关于c++ - 如何在 wt(c++) 创建后更新网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39263587/

相关文章:

c++ - Wt 从 http 响应回调添加新的小部件

c++ - Wt connect函数,将参数传递给函数,该函数是连接函数参数

c++ - unicode 或任何其他编码数据如何存储在内存中? (win32)

c++ - OpenCV 无法连接到视频流 - 缺少某些编解码器?

c++ - 空指针等价于 int

c++ - 异步 Wt::Http::Client 响应和请求匹配

c++ - 多个 WT 应用程序可以在同一个网页上运行吗?

c++ - findChessboardCorners 的 OpenCV 问题

c++ - 在 Linux-gnu/C++ 中哪里可以找到 qextserialenumerator 的 objbase.h

wsl-2 - 如何在WSL中安装和使用Wt(web GUI库)