我正在使用Wt C ++框架,需要将按钮与类函数连接起来。下面的代码工作正常,但需要在一个线程上运行函数doors_open_all,以允许同时使用其他操作。
Wt::WPushButton *open_doors_button = new Wt::WPushButton("open all");
container_box->addWidget(open_doors_button);
open_doors_button->clicked().connect(boost::bind(&Servicemode::doors_open_all, this));
需要一些东西:
open_doors_button->clicked().connect(boost::threaded_bind(&Servicemode::doors_open_all, this));
答案 0 :(得分:0)
如果我理解了问题,您需要在新线程中运行doors_open_all
函数。
boost::thread
构造函数是使用boost::bind
进行内部的。您不需要明确。
所以open_doors_button->clicked().connect(boost:: thread(&Servicemode::doors_open_all, this));
应该完成这项工作。
包含boost::thread
和boost::bind
的版本:
open_doors_button->clicked().connect(boost::thread(boost::bind(&Servicemode::doors_open_all, this)));
编辑:
您也可以尝试使用std::async
来处理这个问题。
答案 1 :(得分:0)
Servicemode::doors_open_all()
做了什么?
如果我认为花费很长时间的东西只是所有后端的东西,所以没有创建,删除或修改小部件,那么你可以在Servicemode::doors_open_all()
内生成一个线程来完成所有后端的东西。完成后,您有两种可能性:
WServer::post()
,向其传递WApplication
的会话ID和函数,以通知应用程序它应更新其UI,并完成所有创建,删除和修改小部件的操作回调。抓取WApplication
的更新锁:
// Assuming that app is a Wt::WApplication*
Wt::WApplication::UpdateLock lock(app); // lock is released when it goes out of scope
获得更新锁定后,您可以继续修改小部件树。
在任何情况下,执行此操作时,您还必须执行以下两项操作:
app->enableUpdates(true)
预先启用服务器推送。线程完成后,您可以再次使用app->enableUpdates(false)
禁用服务器推送。app->triggerUpdate()
将这些更改推送到客户端。如果花费很长时间与UI相关,那么你可以做的就不多了,因为Wt假设你一次只修改一个线程中的WApplication
及其小部件,即你有更新锁。处理来自客户端的事件时,始终会自动获取更新锁定,例如WPushButton::clicked()
。
在serverpush
示例中演示了服务器推送。您可以在Wt源代码树中的examples/feature/serverpush
下找到它。