【问题标题】:how to use boost::bind with std::thread (in Wt c++)如何将 boost::bind 与 std::thread 一起使用(在 Wt c++ 中)
【发布时间】:2018-04-14 00:23:55
【问题描述】:

我正在使用 Wt C++ 框架,需要将按钮与类函数连接起来。下面的代码工作正常,但需要在线程上运行函数 door_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));

【问题讨论】:

  • 你不能在函数Servicemode::doors_open_all()中启动一个新线程吗?
  • 显然不行,它不允许以这种方式使用非静态成员函数。
  • Servicemode::doors_open_all() 内部,您可以启动一个线程来完成它的工作,如果需要的话,给它一个 lambda 函数。但实际上,您也可以在线程中运行非静态成员函数。
  • imho bind 太可怕了,我总是更喜欢 lambda
  • Galik 你在函数中使用 lambda 的想法确实奏效了。如果需要,您可以将其发布为正确的答案。非常感谢。

标签: c++ multithreading boost bind wt


【解决方案1】:

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
    

    当你有更新锁时,你可以继续修改小部件树。

无论如何,在这样做的时候,你还必须做这两件事:

  1. 通过调用app->enableUpdates(true) 预先启用服务器推送。线程完成后,您可以再次使用 app->enableUpdates(false) 禁用服务器推送。
  2. 当您修改了小部件树时,通知 Wt 它应该使用app->triggerUpdate() 将这些更改推送到客户端。

如果需要很长时间与 UI 相关,那么您无能为力,因为 Wt 假设您一次只从一个线程修改 WApplication 及其小部件,即当您进行更新时锁。处理来自客户端的事件时,总是自动获取更新锁,例如WPushButton::clicked()

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

【讨论】:

    【解决方案2】:

    如果我正确理解问题,您需要在新线程中运行 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 来实现此目的。

    【讨论】:

    • 感谢您的建议,但 boost::thread(也带有绑定)给出了一个已删除的函数错误:'错误:使用已删除的函数 'boost::thread::thread(const boost::thread&) '
    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多