Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了cocos2dx C++自定义线程安全消息管理大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

一、背景

由于cocos2dx本身的NotificationCenter是没有进行线程安全处理的,所以当我们在cocos2dx里面使用多线程进行消息同步的时候,

会出现问题。那么为了解决这个问题,我们只需要进行线程安全锁定即可。

为了不修改源码,我模仿NotificationCenter,自定义了一个消息管理。

二、思路

首先,我们定义一个消息体的数据类型 message。他里面存储有消息名称Name,消息处理函数,消息目标,消息内容。

然后,我们定义一个消息管理类。他里面有消息容器。去容纳每一个消息。
管理类对外暴漏的接口只有添加消息和发送消息。具体内容需要自己实现。
最后,将消息容器每次操作加锁即可。一个可以重复利用的,多线消息处理机制就完成了。

三、代码

头文件:

/**************************************************************
 * 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);
		}
	}
}




四、申明

本文原创,为尊重原创,转载时请注明出处。
http://blog.csdn.net/q229827701/article/details/41042147

大佬总结

以上是大佬教程为你收集整理的cocos2dx C++自定义线程安全消息管理全部内容,希望文章能够帮你解决cocos2dx C++自定义线程安全消息管理所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。