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

但是,给出的示例都是关于创建网页的,并且该页面可以响应网页中的事件(即按钮,复选框),我想在启动 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实例都可以使用静态方法WApplication::instance()进行访问,并且对于检查启动参数和设置(使用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使用线程本地存储,这是由Wt在分配线程来处理 session 对象时设置的,因此通常在主线程中返回null。

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

    10-10 19:15