在wt(c ++)中创建后如何更新网页
Posted
技术标签:
【中文标题】在wt(c ++)中创建后如何更新网页【英文标题】:How to update webpage after creation in wt(c++) 【发布时间】:2016-09-01 05:50:00 【问题描述】:我是 wt 的新手,刚刚开始将 Web 界面添加到一个老旧的 c++ 程序中。 示例 hello_world 工作正常。
但是给出的示例都是关于创建网页的,并且页面可以对来自网页的事件做出反应(即按钮、复选框),我想在开始会话后修改网页。更像是 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”为空。显然,这不是完成任务的正确方法。有什么建议吗?
【问题讨论】:
你应该看看一些示例程序 - 这一个问题似乎有很多问题和误解。构建示例确实是您的下一步。 【参考方案1】:您需要:
维护一个您想要发出信号的会话列表,例如通过在构造 WApplication 时将 WApplication 对象放在全局列表中,并在析构函数中将其删除。您也可以更细粒度地执行此操作。 为每个可由服务器端事件更新的应用程序启用服务器推送(只需调用 WApplication::enableUpdates()) 通过获取 WApplication::updateLock 或使用 WServer::post() 在会话上下文中发布函数的执行,以某种方式确保在服务器端修改窗口小部件树时锁定它 widget 树被修改时调用 WApplication::triggerUpdate(),以便将更改推送到客户端此外,您可能希望在 wt_config.xml 文件中启用 websockets 支持。
simplechat 示例几乎演示了所有这些。
WApplication::instance 使用线程本地存储,由 Wt 在分配线程处理会话对象时设置,因此在主线程中返回 null 是正常的。
【讨论】:
以上是关于在wt(c ++)中创建后如何更新网页的主要内容,如果未能解决你的问题,请参考以下文章