如何使用boost :: bind与std :: thread(在Wt c ++中)

时间:2017-11-01 16:06:15

标签: c++ multithreading boost bind wt

我正在使用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));

2 个答案:

答案 0 :(得分:0)

如果我理解了问题,您需要在新线程中运行doors_open_all函数。

boost::thread构造函数是使用boost::bind进行内部的。您不需要明确。

所以open_doors_button->clicked().connect(boost:: thread(&Servicemode::doors_open_all, this));应该完成这项工作。

包含boost::threadboost::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()内生成一个线程来完成所有后端的东西。完成后,您有两种可能性:

  1. 使用WServer::post(),向其传递WApplication的会话ID和函数,以通知应用程序它应更新其UI,并完成所有创建,删除和修改小部件的操作回调。
  2. 抓取WApplication的更新锁:

    // Assuming that app is a Wt::WApplication*
    Wt::WApplication::UpdateLock lock(app); // lock is released when it goes out of scope
    

    获得更新锁定后,您可以继续修改小部件树。

  3. 在任何情况下,执行此操作时,您还必须执行以下两项操作:

    1. 通过调用app->enableUpdates(true)预先启用服务器推送。线程完成后,您可以再次使用app->enableUpdates(false)禁用服务器推送。
    2. 修改小部件树后,通知Wt它应该使用app->triggerUpdate()将这些更改推送到客户端。
    3. 如果花费很长时间与UI相关,那么你可以做的就不多了,因为Wt假设你一次只修改一个线程中的WApplication及其小部件,即你有更新锁。处理来自客户端的事件时,始终会自动获取更新锁定,例如WPushButton::clicked()

      serverpush示例中演示了服务器推送。您可以在Wt源代码树中的examples/feature/serverpush下找到它。