在一次回調中使用了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");