【问题标题】:Boost Bind to Method提升绑定到方法
【发布时间】:2015-08-24 02:27:16
【问题描述】:

我正在尝试使用 boost 线程对我的一个应用程序进行多线程处理。

我遇到的问题是boost::bind

这是我想要做的:

boost::bind(&Class::CalculateRT(i, i - 1), RT));

考虑:

RT is a TransformType 
typedef std::pair<Eigen::Matrix3d, Eigen::Vector3d> TransformType;

CalculateRT 是一种方法: TransformType Class::CalculateRT(int i, int j) 返回,你可以猜到,RT。

我想要的是能够绑定我的方法,获取它返回的内容(RT),然后用类似的东西线程化它:

boost::thread MultiThreadingRTCalculation(boost::bind(&Class::CalculateRT(i, i - 1), RT));

我很确定我将 RT 作为第二个参数使用了错误的绑定。

在查看了其他一些 StackOverflow 问题后,我尝试了这样的事情:

boost::function<TransformType()> BoostFunction(boost::bind(&Class::CalculateRT(i, i - 1), RT));

所有这些在 VS2013 中直到编译时才显示错误,这会弹出:错误 C2825: 'F': must be a class or namespace when after '::' 错误。

感谢您的帮助!

【问题讨论】:

    标签: c++ boost boost-thread boost-bind


    【解决方案1】:

    您误解了bind 的作用。它绑定参数。 IE。它可以通过绑定x=3Foo(x,y)变成Foo(3,y)。您不绑定返回值。

    相反,您需要的是 lambda:[&amp;RT, i](){RT = Class::CalculateRT(i, i - 1)

    当然,如果CalculateRT 是一个非静态方法,那么你需要一个来自某个地方的Class 对象。

    使用方法:

    TransformType RT;
    auto boundFunction = [&RT, i](){RT = Class::CalculateRT(i, i - 1);
    std::thread(boundFunction).detach(); // Doesn't wait for the assignment!
    

    当然,如果你想依赖RT的结果,你可以join()线程来代替。但是到那时,你真的需要一个线程和一个绑定函数吗?

     auto background = std::sync(std::launch::async, &Class::CalculateRT, i,i-1);
     // Do stuff in the foreground.
      RT = background.get();
    

    【讨论】:

    • 我选择其他答案作为解决方案,因为这对我有用,我开始尝试你的建议,但我必须承认它没有成功(可能是因为我对 lambdas 的了解比你的解释)。
    • @Zepherus:我认为可能有更简单的解决方案 - 请参阅更新。
    【解决方案2】:

    Class::CalculateRT(i, i - 1) 是一个函数调用,你尝试获取调用本身的地址...

    尝试类似:boost::bind(&amp;Class::CalculateRT, i, i - 1)(要绑定的地址,参数跟随)。

    如果您希望它为不同的 i 返回不同的值,则可能需要boost::ref(i)

    这是静态方法吗?然后它需要绑定中的this 的值。

    RT 将是绑定调用的结果:

    boost::function<TransformType()> boundFunction = bind(........);
    TransformType RT = boundFunction();
    

    【讨论】:

    • 这就是我正在做的并且似乎正在工作:boost::function&lt;TransformType()&gt; boundFunction = bind(........); TransformType RTtest = boundFunction(); boost::thread BT(boundFunction); 我想知道是否可以将参数传递给 boundFunction,例如:` boost::bind(&Class::CalculateRT, i , i - j) RT = boundFunction(j); ` 可能要求太多 x) ?
    • 绑定使用_1(来自boost/bind/placeholders.hpp)而不是i。在绑定函数中,它将扩展为“第一个传递的参数”。并将boost::function 类型更改为&lt;TransformType(int)&gt;
    • 这实际上是我尝试使用的,但在此之后我得到了这个:错误 24 错误 C2064:术语不计算为采用 0 个参数的函数 C:\Libraries\boost_1_57_0\boost\thread\detail\thread。 hpp 这就是我所做的:boost::function&lt;TransformType(int,int)&gt; boundFunction2 = boost::bind(&amp;Class::CalculateRT, this, _1, _2); TransformType RT = boundFunction(i,j); boost::thread BT(boundFunction); 我也尝试了boost::thread BT(boundFunction(i,j)) 但无济于事。编辑:(为什么我的换行符不起作用:(?)
    • @Zepherus:请记住,RT = boundfunction() 会立即调用绑定函数,并将结果存储在RT 中。然后线程再次调用boudn函数,但这次丢弃了结果。
    • @Zepherus 问题在boost::thread BT(boundFunction); - 这个线程构造函数需要零参数函数作为它的参数。试试boost::thread BT(boundFunction, i, j);,它将创建线程并在其中调用boundFunction,其中i和j作为参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2012-12-06
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多