2014-02-07 184 views
0

我有以下VxWorks中的程序是大程序消息队列发送和接收

/* defines */ 
#define MAX_MESSAGES 100 
#define MAX_MESSAGE_LENGTH 50 


if ((msgQStudyId = msgQCreate(MAX_MESSAGES,MAX_MESSAGE_LENGTH,MSG_Q_FIFO)) == NULL) { 
     printf("msgQCreate in failed\n"); 
} 


CVenkyMsgQWrite *pMsgWrite = new CVenkyMsgQWrite(); 
    pMsgWrite->OpenWrite(); 


    CVenkyMsgQRead *pMsgRead = new CVenkyMsgQRead(); 
    pMsgRead->OpenRead(); 

class CVenkyMsgQWrite { 

public : 
    // Constructors and destructors: 
    CVenkyMsgQWrite(); 
    ~CVenkyMsgQWrite(); 

    RESULT OpenWrite(void); 
    void TaskLoop(void); 

}; 


class CVenkyMsgQRead { 

public : 
    // Constructors and destructors: 
    CVenkyMsgQRead(); 
    ~CVenkyMsgQRead(); 

    RESULT OpenRead(void); 
    void TaskLoop(void); 



CVenkyMsgQWrite::CVenkyMsgQWrite() { 
    // Open(void); 
} 

CVenkyMsgQWrite::~CVenkyMsgQWrite() { } 

static int WriteTask(const void *envPtr) 
{  
    CVenkyMsgQWrite *ctrl = (CVenkyMsgQWrite *)envPtr; 
    try 
    { 
     ctrl->TaskLoop(); // Normal run 
     return CI857_ERROR; 
    } 
    catch(...) 
    { 
     CI857DBG(printError,("Error in Controller input task\n",0,0,0,0,0,0));  
    } 
    return CI857_ERROR; 
} 

RESULT CVenkyMsgQWrite::OpenWrite(void) { 

    RESULT ret = CI857_OK; 

    taskSpawn("VenkyMsgQWrite", 
     78, 
     0, 
     4096, /* stack size */ 
     WriteTask, 
     this, 2,3,4,5,6,7,8,9,10); 
    return ret; 
} 

void CVenkyMsgQWrite::TaskLoop(void) 
{ 
    STATUS MsgQStatus = OK; 

    // MsgQStatus = msgQSend(msgQStudyId, (char*)pPHData, iDataLength, NO_WAIT, MSG_PRI_NORMAL); 
    // if(ERROR == MsgQStatus) 
    // { 
     // m_pILogHandler->Log((cConfigMod|cError),"#%d: Error: SendToConfMsgQ() msgQSend failed with Err %d.",__LINE__,errnoGet()); 
    // } 

    while(1) { 

     char message[] = "message"; 

     /* send message */ 
     if((msgQSend(msgQStudyId,message,strlen(message), WAIT_FOREVER,  MSG_PRI_NORMAL)) == ERROR) { 
      printf("msgQSend in CVenkyMsgQWrite::TaskLoop failed\n"); 
     } 
     else { 
      printf("msgQSend in CVenkyMsgQWrite::TaskLoop success\n"); 
     } 
     vosSleepMs(1000); 
    } 



} 

CVenkyMsgQRead::CVenkyMsgQRead() { 
    // Open(void); 
} 

CVenkyMsgQRead::~CVenkyMsgQRead() { } 

static int ReadTask(const void *envPtr) 
{  
    CVenkyMsgQRead *ctrl = (CVenkyMsgQRead *)envPtr; 
    try 
    { 
     ctrl->TaskLoop(); // Normal run 
     return CI857_ERROR; 
    } 
    catch(...) 
    { 
     CI857DBG(printError,("Error in Controller input task\n",0,0,0,0,0,0));  
    } 
    return CI857_ERROR; 
} 

RESULT CVenkyMsgQRead::OpenRead(void) { 

    RESULT ret = CI857_OK; 

    taskSpawn("VenkyMsgQRead", 
     79, 
     0, 
     4096, /* stack size */ 
     ReadTask, 
     this, 2,3,4,5,6,7,8,9,10); 
    return ret; 
} 

void CVenkyMsgQRead::TaskLoop(void) 
{ 
    STATUS MsgQStatus = OK; 

    char msgBuf[MAX_MESSAGE_LENGTH]; 
    memset(msgBuf, 0x00, sizeof(msgBuf)); 

    while(1) { 

     /* receive message */ 
     int msgLength = msgQReceive(msgQStudyId, msgBuf, MAX_MESSAGE_LENGTH, WAIT_FOREVER) ; 
     if(msgLength == ERROR) { 
      printf("msgQReceive in taskTwo failed\n"); 
     } 
     else { 
      printf(" Length received %d and string is %s\n", msgLength, msgBuf); 
     } 
     vosSleepMs(5000); 

     memset(msgBuf, 0x00, sizeof(msgBuf)); 
    } 
} 

下面的部分是输出。

enter code here> msgQSend在CVenkyMsgQWrite :: TaskLoop成功msgQSend在

CVenkyMsgQWrite :: TaskLoop成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功长度接收7和字符串中 CVenkyMsgQWrite是 消息msgQSend在CVenkyMsgQWrite :: TaskLoop成功msgQSend :: TaskLoop成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功msgQSend在 CVenkyMsgQWrite ::任务循环成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功接收长度7和串是 消息msgQSend在CVenkyMsgQWrite :: TaskLoop成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功长度收到7和字符串是 消息msgQSend在CVenkyMsgQWrite :: TaskLoop成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功msgQSend在 CVenkyMsgQWrite :: TaskLoop成功

我的问题是

  1. 由于我们正在发送数据的快速然后任务被读取,因为我们可以具有最大长度50我在队列中的期望5级的消息和lenght 100个的消息的接收为35.但是,这不是这种情况,因为我们从上面的输出可以看到我们正在阅读7和单个消息的长度。

我做对了吗?这是预期的行为?如果我想阅读35的长度,我应该如何阅读?

回答

1

Message Queue接口是基于消息的,它不是像TCP套接字那样的流接口。

您正在调用带7字节消息的msgQSend。每个调用都是一个单独的消息。

因此,每个msgQReceive将单独收到这些消息。

如果您想接收队列中的所有消息,请删除您的5秒钟睡眠语句... msgQReceive将挂起任务直到有新消息进入。