大佬教程收集整理的这篇文章主要介绍了cocos2dx C++自定义线程安全消息管理,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
由于cocos2dx本身的NotificationCenter是没有进行线程安全处理的,所以当我们在cocos2dx里面使用多线程进行消息同步的时候,
会出现问题。那么为了解决这个问题,我们只需要进行线程安全锁定即可。
为了不修改源码,我模仿NotificationCenter,自定义了一个消息管理。
/************************************************************** * Copyright (C) 2014-11-12 by real.Xm * Blog Address: http://blog.csdn.net/q229827701 * Email: 229827701@qq.com **************************************************************/ #ifndef __XmessaGE__H #define __XmessaGE__H #include "cocos2d.h" class Xmessage; class CC_DLL messageMsg : public cocos2d::ref { public: messageMsg(); virtual ~messageMsg(); static messageMsg* geTinstance(); bool addObserver(const std::string &msgName,cocos2d::ref* target,cocos2d::SEL_CallFuncO SELEctor,cocos2d::ref* msgContent = nullptr); bool postmessage(const std::string &msgName,cocos2d::ref* msgContent); bool removeObserverByName(const std::string &msgName,cocos2d::ref* target = nullptr); bool removeAllObservers(cocos2d::ref* target); protected: Xmessage* getmessageByName(const std::string &msgName) const; private: //message container cocos2d::Vector<Xmessage*> _msgContainer; }; class CC_DLL Xmessage: public cocos2d::ref { public: Xmessage(const std::string &msgName,cocos2d::ref* msgContent); ~Xmessage(); void handermessage(cocos2d::ref* msgContent); CC_SYNTHESIZE_READONLY(std::string,_msgName,messageName);//message name CC_SYNTHESIZE_READONLY(cocos2d::ref*,_target,Target); //target CC_SYNTHESIZE_READONLY(cocos2d::SEL_CallFuncO,_SELEctor,SELEctor);//function CC_SYNTHESIZE_READONLY(cocos2d::ref*,_msgContent,messageConent);//function args }; #endif // !_XmessaGE_H
#include "XmessageManger.h" std::mutex _ContainerMutex; static messageMsg* _Manager = nullptr; messageMsg::messageMsg() { } messageMsg::~messageMsg() { _msgContainer.clear(); } messageMsg* messageMsg::geTinstance() { if (!_Manager) { _Manager = new messageMsg; } return _Manager; } bool messageMsg::addObserver( const std::string &msgName,cocos2d::ref* msgContent /*= nullptr*/ ) { if (!getmessageByName(msgName)) { auto msg = new Xmessage(msgName,target,SELEctor,msgContent); IF_NULL_RETURN_falSE(msg); msg->autorelease(); std::lock_guard<std::mutex> ul(_ContainerMuteX); _msgContainer.pushBACk(msg); return true; } return false; } bool messageMsg::postmessage( const std::string &msgName,cocos2d::ref* msgContent ) { auto msg = getmessageByName(msgName); if (msg) { msg->handermessage(msgContent); return true; } return false; } Xmessage* messageMsg::getmessageByName( const std::string &msgName ) const { std::lock_guard<std::mutex> ul(_ContainerMuteX); for (auto &msg : _msgContainer) { if (msgName == msg->getmessagename()) { return msg; } } return nullptr; } bool messageMsg::removeObserverByName( const std::string &msgName,cocos2d::ref* target /*= nullptr*/ ) { std::lock_guard<std::mutex> ul(_ContainerMuteX); for (auto &msg : _msgContainer) { if (msgName == msg->getmessagename() &&(target == msg->getTarget()||!target)) { _msgContainer.eraseObject(msg,truE); return true; } } return false; } bool messageMsg::removeAllObservers( cocos2d::ref* target ) { std::lock_guard<std::mutex> ul(_ContainerMuteX); for (auto &msg : _msgContainer) { if (target == msg->getTarget()) { _msgContainer.eraseObject(msg,truE); return true; } } return false; } ////////////////////////////////////////////////////////////////////////// /// Xmessage Class ///////////////////////////////////////////////////////////////////////// Xmessage::Xmessage( const std::string &msgName,cocos2d::ref* msgContent ) :_msgName(msgName),_target(target),_SELEctor(SELEctor),_msgContent(msgContent) { } Xmessage::~Xmessage() { } void Xmessage::handermessage( cocos2d::ref* msgContent ) { if (_target) { if (msgContent) { (_target->*_SELEctor)(msgContent); } else { (_target->*_SELEctor)(msgContent); } } }
以上是大佬教程为你收集整理的cocos2dx C++自定义线程安全消息管理全部内容,希望文章能够帮你解决cocos2dx C++自定义线程安全消息管理所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。