联系方式:
support@gamebs.com

示例程序 EngineCommunication

该示例源码位于$GAMEBS_ROOT/Samples/EngineCommunicationDemo目录下。($GAMEBS_ROOT为开发包安装的根目录)

在编译运行之前,你需要对VC做适当的配置,参考: 搭建开发环境

程序的目标

本程序的目标是创建两个引擎A和B,分别安装在主控容器和嵌入容器。主控引擎启动一个时钟,间隔2秒向嵌入引擎发消息请求数据,在收到应答之前主控引擎不会往下执行。嵌入引擎也启动一个时钟,间隔3秒向主控引擎报告某个状态的变化。

程序的构成

本程序包含三个工程:

图1:EngineCommuniationDemo用户界面

程序说明

当平台安装后,点击“启动时钟A”按钮,将发送用户消息"StartTimer"给主控引擎CollisionEngineA。CollisionEngineA收到消息后,启动一个2秒钟的时钟。启动时钟的接口是:

CNTT_HANDLE cntt_SetTimer(cntt_uint32 ulMillis, CNTT_TIMEOUTFUNC vTimerFunc, cntt_uint32 ulParam, cntt_uint32 ulFlag);

该时钟的到时处理函数是Polling_TimeOut,其代码如下,

static void CNTTCALLBACK Polling_TimeOut(CNTT_HANDLE handle, unsigned long ulParam)
{
PBYTE pResultData;
int ResultDataLen;
CCollisionEngine *pEngine = (CCollisionEngine*)ulParam;

if (pEngine->RpcSend("CollisionEngineB", "SayHelloToB", (PBYTE)"A: How are you?", 16, pResultData, ResultDataLen) >= 0)
{
WT_Trace("%s\n", pResultData);
}
else
{
WT_Trace("A: Polling_TimeOut: RpcSend failed\n");
}
}

该函数会调用RpcSend发送消息"SayHelloToB"给嵌入引擎CollisionEngineB,消息内容是"A: How are you?"。

CollisionEngineB收到消息的处理函数代码如下,


int CCollisionEngine::OnMessageProc(LPCSTR lpMsgName, PBYTE pMsgData, int nMsgDataLen, BOOL bNeedReturn)
{
char result[256] = {0};

if (strcmp(lpMsgName, "SayHelloToB") == 0)
{
WT_Trace("%s\n", pMsgData);

sprintf(result, "B: I am fine. Thanks.");
RpcReturn((PBYTE)result, strlen(result)+1);
}

return 0;
}

当CollisionEngineB收到"SayHelloToB"消息后,通过函数RpcReturn返回结果"B: I am fine. Thanks."。

参考RpcSend的接口描述可知,只有当CollisionEngineB收到消息并把结果返回给CollisionEngineA后,函数RpcSend才会返回,CollisionEngineA才会继续向下执行。返回结果保存在pResultData指向的内存中,长度为ResultDataLen。

如果点击“启动时钟B”按钮,将发送用户消息"StartTimer"给嵌入引擎CollisionEngineB。CollisionEngineB收到消息后,启动一个3秒钟的时钟。该时钟的处理函数代码如下,

static void CNTTCALLBACK Polling_TimeOut(CNTT_HANDLE handle, unsigned long ulParam)
{
CCollisionEngine *pEngine = (CCollisionEngine*)ulParam;

if (pEngine->RpcPost("CollisionEngineA", "NotifyToA", (PBYTE)"B: There is something changed.", 31) == -1)
{
WT_Trace("B: Polling_TimeOut: RpcPost failed\n");
}
}

该函数会调用RpcPost发送消息"NotifyToB"给主控引擎CollisionEngineA,消息内容是"B: There is something changed."。

参考RpcPost的接口描述,它与RpcSend不同,调用函数RpcPost发送完通知消息后马上返回,不管对方是否收到消息。所以,RpcSend和RpcPost的区别与Windows的接口函数SendMessage和PostMessage的区别非常相似。

需要打开PacketDebug查看执行结果。

 

点击按钮“停止时钟A”,将会发送消息“StopTimer”给CollisionEngineA,停止CollisionEngineA已经启动的时钟。

同样,点击按钮“停止时钟B”,将会发送消息“StopTimer”给CollisionEngineB,停止CollisionEngineB已经启动的时钟。

总结

这个例子演示了主控引擎与嵌入引擎的通信方法,一个引擎可以调用函数RpcSend向对方请求数据,或调用函数RpcPost发送通知。