请教有关 thread safe 问题, httpClient 下载的数据main thread读取

Hi~请问各位前辈
有关 httpclient 下载的资料如何在 main thread 读取的?小弟开发的游戏因为使用了 httpclient 到 web server 下载数据,
并且透过 schedule 方式来读取这些数据, 但游戏就是会莫名其妙的报错, 然后关闭游戏(直接 crash掉), 我的源码如下,希望前辈门可以协助,感恩!

  1. 我的程序码是这样的,按下购买卡片的按钮后,将参数传送给 buyCard.aspx, 并且设定 schedule, 每隔0.3秒就检查一下下载状态(status)
void WuXiaButtonSaleBuy::buyCard()
{
status = BuyCardButtonBuying;
this->schedule(schedule_selector(WuXiaButtonSaleBuy::CheckStatus),0.3f);
cocos2d::extension::CCHttpRequest* request = new cocos2d::extension::CCHttpRequest();
char* url= new char;
string buySaleParams = WuXiaPlayer::player->sessionId.c_str();
buySaleParams.append("," + saleId);
sprintf(url,"%sbuyCard.aspx?text=%s",WuXiaServer::SecondaryServer,base64_encode(buySaleParams.c_str()).c_str()); 
request->setUrl(url);
request->setRequestType(cocos2d::extension::CCHttpRequest::kHttpGet);
request->setResponseCallback(this, httpresponse_selector(WuXiaButtonSaleBuy::OnBuyCompleted));
cocos2d::extension::CCHttpClient::getInstance()->send(request);
request->release();
delete url;
}
  1. 接着下载完成后, 将资料保存到 sString 全域变数, 并且将下载状态改成 BuyCardButtonBought
void WuXiaButtonSaleBuy::OnBuyCompleted(cocos2d::extension::CCHttpClient* client, cocos2d::extension::CCHttpResponse* response)
{
    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();

    std::vector<char> buffer = response->getResponseData();
    char cString = new char;
    for (unsigned int i=0;i<buffer->size();i++)
    {
    sprintf(cString+i,"%c",(*buffer));
    }

    std::string newStr(cString);

    std::size_t found = newStr.find("ERROR");
    if (found==std::string::npos && newStr.find("SUCCESS#" ) != std::string::npos && newStr.find("#SUCCESS" ) != std::string::npos)
    {
        buyResult = newStr;
        status = BuyCardButtonBought;
    }
    else
    {
        status = BuyCardButtonFailed;
    }
}
  1. schedule 每隔一断时间检查一次, 如果状态为BuyCardButtonBought 就开始将刚才所读取到的资料 split 后保存到 parts 中, 并且产生一个 sprite 显示到画面上
void WuXiaButtonSaleBuy::CheckStatus(float dtTime)
{
    if (status == BuyCardButtonFailed)
    {
        // ask player whether to buy again or not.
        return;
    }
if (status == BuyCardButtonBought)
{
    vector<string> parts = StringHelper::split(sString,"#");
     CCSprite* sprite = CCSprite::Create(parts .at(1).c_str());
    this->addChild(sprite);
    status = BuyCardButtonNormal;
}

}

上面这些有时可以正常的运作, 有时载显示完 sprite 后, 在不固定的地方就会报错并关闭游戏
恳请前辈指点,感谢!*

看到“有时”这种事,就觉得和内存有关…

hi ~aochulai :
请问有可能是舍么原因导致的?

解決了,原本以為是 Thread Safe 的問題,
真正原因是 new char 時, buffer 少計算了結尾空字元,
char cString = new char; 改為 char cString = new char; 就不再 crash 掉了

楼主你好,我得好好谢谢你,我遇到了跟你一样的问题,一个月了,程序时而OK,时而崩溃,BAD_EXCESS的地方五花八门,
我甚至认为protobuf引用出了问题,或者CCHttpClient存在Clock打断main thread的固有BUG,或者某一天不小心动了框架代码。
结果全都是这个size()+1惹的祸…

再次谢谢楼主 谢谢谢谢…

你这样写也不够安全,因为,栈的空间是有限的,万一的buf太大,程序会挂掉