前面总结了一篇链表的文章,现基于该链表实现进程内的多线程通信方式。
typedef struct
{
bool32 isWork;
bool32 isExit;
mutexHandle hMutex;
queHandle hQueRdWr;//申请的链表结构体指针
queHandle hQueAck;
thrHandle hThr;//返回的线程句柄
comCreateParam param;
Ptr trustArgs;
comTrustFxn trustFxn;
}comNodeObj;
/**************************************************
*
*
*
*******************************************************/
static Int32 encTrustFxn(Ptr pBody,Ptr pUsrArgs)
{
Int32 status = SOK;
encodeNode *pNode = (encodeNode *)pUsrArgs;
comBody2Enc *pEncBody = (comBody2Enc *)pBody;
switch(pEncBody->type)
{
case XXX:
{
......
break;
}
default:
break;
}
if(status != SOK)
{
error();
}
return SOK;
}
/**********************************************
*
*
*
*************************************************/
Int32 comEntrust(Handle hCom,comTrustFxn pFxn,Ptr pUsrArgs)
{
Int32 status;
thrCreate thrParam;
comNodeObj *pNode = (comNodeObj *)hCom;
assertNotNull(pNode);
assertNotNull(pFxn);
if(pNode->hThr != NULL)
{
error("");
return EFAIL;
}
clear(&thrParam);
thrParam.OpThrRun = comTask;//线程主体函数
thrParam.thrPol = SCHED_FIFO;
thrParam.thrPri = HIGH;
thrParam.stackSize = SIZE_DEFAULT;
pNode->trustArgs = pUserArgs;
pNode->trustFxn = pFxn;
thrParam.pUsrArgs = pNode;
status = thrCreate(&thrParam,&(pNode->hThr));
if(status != OK)
{
return EFAIL;
}
return OK;
}
/*********************************
*创建通信节点
*
*
***********************************/
Int32 comCreate(comCreateParam *pParam,Handle *hCom)
{
Int32 status = SOK;
comNodeObj *pNode = NULL;
*hCom = NULL;
pNode = memAlloc(sizeof(comNodeObj));
clear(pNode);
queParam.maxElems = pParam->maxBodyBuf;
status = queListCreate(&queParam,&(pNode->hQueRdWr));
if(status != SOK)
{
error();
memFree(pNode);
return status;
}
queParam.maxElems = pParam->maxBodyBuf;
status = queListCreate(&queParam,&(pNode->hQueAck));
if(status != SOK)
{
error();
queListDelete(pNode->hQueRdWr);
memFree(pNode);
return status;
}
memCpySize(&(pNode->param),pParam,sizeof(comCreateParam));
mutexCreate(0,&pNode->hMutex);
pObj->nodes[pParam->actor.nodeId] = pNode;
*hVsfCom = pNode;
return SOK;
}
Int32 encInit()
{
Int32 status = SOK;
encodeNode *pNode = NULL;
encodeObject *pObj = &gEncObj;
union
{
comCreateParam comParam;
......
}initParam;
clear(&initParam);
cfgGetActor(COM_NODE_ID_ENCODE,&(initParam.comParam.actor));
initParam.comParam.maxBodyBuf = 64;
initParam.comParam.priority = PRIORITY_HIGH;
initParam.comParam.sleepMs = 10;
status = comCreate(&(initParam.comParam),&(pObj->hCom));
status |= comEntrust(pObj->hCom,encTrustFxn,pNode);
pObj->pNode = pNode;
return SOK;
}
接下来看一个实例调用。
static Int32 palEncTxParam()
{
Int32 status = SOK;
comBody2Enc *pBody = NULL;
comActor actor;
videoEncObj *pObj = NULL;
pObj = &gVideoEncObj[0];
status = cfgGetActor(COM_NODE_ID_ENCODE,&actor);
pBody = (comBody2Enc *)comNewBody(pObj->hCom,&actor,sizeof(comBody2Enc));
pBody->type = ;
pBody->stream = 0;
pBody->channel = 0;
if(size>0)
{
memCpySize(&(pBody->detail),pParam,size);
}
}