[英]how to use boost::bind with std::thread (in Wt c++)
我正在使用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));
如果我正确理解问题,则需要在新线程中运行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
。
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
下找到它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.