cocos2dx 线程通信问题,希望牛人能解答出来。。。。

大家都知道在cocos2dx中,子线程不能用于更新主界面,更新界面是主线程的事,现在我也碰到一个这样的问题,
问题:

子线程中不断接受服务器发过来 的信息,但是我要根据这些信息去创建一些人物,但是在子线程中调用创建方法,界面中显示不出来 ,我想过很我办法,以下两种方法都是我采用的,但是都解决不了这个问题:

1:CCNotificationCenter,很多人都说用这个,我也用了,消息可以发过去,但是还是创建不了人物了来。

2:创建一个queue消息队列,而子线程收到服务器消息后,就把消息加入到这个队列中去,而主线程定时的去轮询这个消息队列,当取到消息后就执行,这个方式很不错,但是还是不能在界面上添加一个人物,方法依然能执行,人物依然不能创建 。

在这里,我想请各位大神,有什么好的解决办法。。。。。。。

以下是一段简单的CCNotificationCenter测试代码,但是这段代码是不能在主界面中添加人物的:

// 1: 添加观察者
CCNotificationCenter::sharedNotificationCenter()->addObserver(this,callfuncO_selector(HelloWorld::test),“socket”,NULL);

// 2: 创建数据读取线程
pthread_t pid;
pthread_create(&pid, NULL, HelloWorld::messageRciveThread, this);

//3: 创建线程函数
void* HelloWorld::messageRciveThread(void *ptr)
{
//在线程中发送消息,— 很多人都说这一行代码 是子线程向主线程发送消息。可我认为还在子线程中。
CCNotificationCenter::sharedNotificationCenter()->postNotification(“socket”,NULL);
}

//4: 执行的方法
void HelloWorld::test(cocos2d::CCObject *pObject)
{
CCSprite *sprite = CCSprite::create(“HelloWorld.png”);
sprite->setPosition(ccp(500,300));
this->addChild(sprite);
CCLog(“addCHild…”); //----》 这一行代码能打印出来 ,可是主界面中,就是没有图片。
}

希望高手能帮我解决一下。。。。。。

你这段代码确实不行了~属于在子线程里创建精灵

但是你说的第二个方案就能解决吖,我也是这么做,一直都没有问题
在写入和读取队列的时候,加个锁。
然后主程序里每隔一段时间(或者一帧)读取一次队列,把队列里的消息都发送出去就可以了~:894:

可能是你某个地方没处理好吧~

第二个方法肯定可以做的,LZ检查一下是不是哪里代码不对

目测是你用的this的问题
换成CCDirector::shareddirector()->getrunningScene()->getchildbytag()这种方式获取Layer
然后addChild试试

请问你的问题解决了吗?

同样存在这个问题。在线程里对一个Text控件做setString,原文本的内容没了,但setString的内容没有显示出来。

第二种方法确实是正确的操作方式吧,
socket分线程只负责将收到的消息添加到接收序列里,
主线程监测只要请求序列中存在消息就定时监测接收序列。
再根据接收序列中的数据格式去调用特定的方式去处理返回数据

第二种方法我经常用啊

会不会是SetString时,新的字符串内容为空呀。用一个不为空的可变字符串来试下.

/** calls a function on the cocos2d thread. Useful when you need to call a cocos2d function from another thread.
This function is thread safe.
@since v3.0
*/
void performFunctionInCocosThread( const std::function<void()> &function);

如果楼主用的是2.x的引擎的话 就用这个
void CCScheduler::scheduleSelector(SEL_SCHEDULE pfnSelector, CCObject *pTarget, float fInterval, unsigned int repeat, float delay, bool bPaused)

CCNotificationCenter不是线程安全的,如果是3.x版本引擎可以使用9楼的办法