大佬教程收集整理的这篇文章主要介绍了【Cocos2d-x】C++自定义线程安全消息管理,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
一、背景
由于Cocos2d-x本身的NotificationCenter是没有进行线程安全处理的,所以当我们在Cocos2d-x里面使用多线程进行消息同步的时候,会出现问题。那么为了解决这个问题,我们只需要进行线程安全锁定即可。
为了不修改源码,我模仿NotificationCenter,自定义了一个消息管理。
二、思路
首先,我们定义一个消息体的数据类型message。他里面存储有消息名称Name,消息处理函数,消息目标,消息内容。
然后,我们定义一个消息管理类。他里面有消息容器。去容纳每一个消息。管理类对外暴漏的接口只有添加消息和发送消息。具体内容需要自己实现。
最后,将消息容器每次操作加锁即可。一个可以重复利用的,多线消息处理机制就完成了。
三、代码
头文件:
1
2
3
4
@H_772_51@
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@H_197_103@
31
32
33
34
35
36
37
38
39
40
41
42
43
|
*BlogAddress:http://blog.csdn.net/q229827701
*Email:229827701@qq.com
#ifndef__XmessaGE__H
#define__XmessaGE__H
#include"cocos2d.h"
class
Xmessage;
:
postmessage(
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,cocos2d::ref*msgContent);
removeObserverByName(
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,cocos2d::ref*target=nullptr);
protected
:
private
:
//messagecontainer
cocos2d::Vector<Xmessage*>_msgContainer;
};
:
Xmessage(
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,cocos2d::ref*msgContent);
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,_msgContent,messageConent);
//functionargs
};
#endif//!_XmessaGE_H
|
实现文件:
#include"XmessageManger.h"
std::mutex_ContainerMutex;
messageMsg*_Manager=nullptr;
}
_msgContainer.clear();
}
if
(!_Manager)
}
return
_Manager;
}
messageMsg::addObserver(
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,cocos2d::SEL_CallFuncOSELEctor,cocos2d::ref*msgContent
/*=nullptr*/
)
std::lock_guard<std::mutex>ul(_ContainerMuteX);
return
true
;
}
false
;
}
messageMsg::postmessage(
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,cocos2d::ref*msgContent)
(msg)
;
}
;
}
std::lock_guard<std::mutex>ul(_ContainerMuteX);
for
(auto&msg:_msgContainer)
@H_223_137@msg;
}
}
nullptr;
}
messageMsg::removeObserverByName(
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,cocos2d::ref*target
)
std::lock_guard<std::mutex>ul(_ContainerMuteX);
(auto&msg:_msgContainer)
&&(target==msg->getTarget()||!target))
;
}
}
;
}
std::lock_guard<std::mutex>ul(_ContainerMuteX);
(auto&msg:_msgContainer)
(target==msg->getTarget())
;
}
}
;
}
//////////////////////////////////////////////////////////////////////////
///XmessageClass
/////////////////////////////////////////////////////////////////////////
Xmessage::Xmessage(
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,cocos2d::ref*msgContent)
}
}
(_target)
(msgContent){
}
}
}
|
以上是大佬教程为你收集整理的【Cocos2d-x】C++自定义线程安全消息管理全部内容,希望文章能够帮你解决【Cocos2d-x】C++自定义线程安全消息管理所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。