在一次回调中使用了lambda表达式,传进来的值失效,主要是对lambda表达式了解的不够深入,记录下来!
1、[函数对象参数],标识一个Lambda的开始,这部分必须存在,不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式:
1、空。没有使用任何函数对象参数。
2、=。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
3、&。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。
4、this。函数体内可以使用Lambda所在类中的成员变量。
5、a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
6、&a。将a按引用进行传递。
7、a, &b。将a按值进行传递,b按引用进行传递。
8、=,&a, &b。除a和b按引用进行传递外,其他参数都按值进行传递。
9、&, a, b。除a和b按值进行传递外,其他参数都按引用进行传递。
如下改正,问题就解决了:
Director::getInstance()->getScheduler()->performFunctionInCocosThread([&, this, region, delay, speed, percent]() //注意要加:this
其他代码不动。
m_speedTest->start(si.name, si.ip, si.port, testTime, [&](std::string region, int delay, float speed, int percent)
<span style="white-space:pre"> </span> {
Director::getInstance()->getScheduler()->performFunctionInCocosThread([&, this, region, delay, speed, percent]() //加上:this
<span style="white-space:pre"> </span>{
int iPercent = percent;
if (iPercent >= 100)
{
if (m_loadingBar->getPercent() < 50.0f)//timeout
{
iPercent = 0;
startTestCallBack(region, delay, speed, percent);
return;
}
}
m_loadingBar->setPercent(iPercent);
<span style="white-space:pre"> </span> if (percent >= 100)
<span style="white-space:pre"> </span> {
m_isTimeout = false;
if (m_speedTest)
{
removeSpeedTest();
startTestCallBack(region, delay, speed, percent);
}
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span> });
});
//如果timeout连不上,手动断开
m_isTimeout = true;
scheduleOnce([&](float f)
{
if (m_isTimeout)
{
removeSpeedTest();
}
},
testTime + 1, "speedTestTimeout");