主要实现如下功能:
1.初始化一组自定义对象;
2.pthread线程里建立socket获取json;
3.while循环不停的获取json,每获取一次就用postNotification通知主线程
4.主线程收到通知,解析json,设置一开始那组自定义对象状态;
部分代码如下:
初始化对象,之后启动线程建立socket获取数据,然后注册CCNotificationCenter
others = CCArray::createWithCapacity(14);
CC_SAFE_RETAIN(others);
for(int i=0;i<14;i++){
Player* p = Player::create();
p->retain();
others->addObject(p);
}
ODSocket *pODSocket = ODSocket::sharedODSocket();
pODSocket->msg_To_Sever = CCString::createWithFormat( "%s\r\n",roomid)->getCString();
TigerThread tt;
tt.threadStart();
CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(GameScene::getServerData), "receivedata", NULL);
```
子线程部分代码:
pthread_create(&mythead, &tAttr, thread_funcation, this);
void* TigerThread::thread_funcation(void *arg)
{
ODSocket *pSocket = ODSocket::sharedODSocket();
pSocket->Init();
pSocket->Create(AF_INET, SOCK_STREAM,0);
std::string rec_msg;
int start;
int end;
if (pSocket->Connect("服务器ip", 端口)) {
printf("connect done.");
while (true) {
char recvBuf = "\0";
std::string testmsg= pSocket->msg_To_Sever;
pSocket->Send(testmsg.data(),testmsg.length(),0);
int ret = pSocket->Recv(recvBuf,2024,0);
while(ret>0)
{
rec_msg=std::string(recvBuf);
start = rec_msg.find("");
end = rec_msg.find("");
//
if(start!=-1&&start<end){
break;
}else{
rec_msg = rec_msg.append(recvBuf,ret);
}
}
start = rec_msg.find("")+5;
end = rec_msg.find("");
CCNotificationCenter::sharedNotificationCenter()->postNotification("receivedata", (CCObject*)rec_msg.substr(start,end-start).c_str());
if (ret==-1) {
printf("server error");
break;
}
}
}
else
{
CCLog("服务器连接失败");
}
pSocket->Close();
pSocket->Clean();
return NULL;
}
```
主线程收到通知后,在getServerData里处理other里的Player对象,就是出现各种莫名其妙的EXC_BAD_ACCESS,NaN,错误,每次还出现的不一样,感觉就像是没有同步好。
如果不用子线程,测试了一下直接设置others里的Player对象是正常的。
