2016-05-23 19 views
1

我正在使用Linux 32位OpenSplice DDS社区版。在这里,我可以有多个主题,其中数据编写者可以写入这个主题,发布者将发布这些主题。我试图修改现有的源代码,在那里我试图得到输出,如下图所示:在DDS中为多个主题创建多个数据写入器

Chatter 1: Hi there, I will send you 10 more exxpert messages. 
    Chatter 1: Message no. 1 
    Chatter 1: Message no. 2 
    Chatter 1: Message no. 3 
    Chatter 1: Message no. 4 
    Chatter 1: Message no. 4 
    Chatter 1: Message no. 5 
    Chatter 1: Message no. 6 
    Chatter 1: Message no. 7 
    Chatter 1: Message no. 8 
    Chatter 1: Message no. 9 
    Chatter 1: Message no. 10 

和如下图所示的源代码:

/* Initialize the chat messages on Heap. */ 
msg = Chat_ChatMessage__alloc(); 
checkHandle(msg, "Chat_ChatMessage__alloc"); 
msg->userID = ownID; 
msg->index = 0; 
msg->content = DDS_string_alloc(MAX_MSG_LEN); 
checkHandle(msg->content, "DDS_string_alloc"); 
if (ownID == TERMINATION_MESSAGE) { 
    snprintf (msg->content, MAX_MSG_LEN, "Termination message."); 
} else { 
    snprintf (msg->content, MAX_MSG_LEN, "Hi there, I will send you %d more messages.", NUM_MSG); 
} 
printf("Writing message: %s\n", msg->content); 

//Initialize the chat messages on Heap// 

/* Register a chat message for this user (pre-allocating resources for it!!) */ 
userHandle = Chat_ChatMessageDataWriter_register_instance(talker, msg); 

/* Write a message using the pre-generated instance handle. */ 
status = Chat_ChatMessageDataWriter_write(talker, msg, userHandle); 
checkStatus(status, "Chat_ChatMessageDataWriter_write"); 

/* Register a chat message for this user (pre-allocating resources for it!!) */ 
userHandle = Chat_ChatMessageDataWriter_register_instance(chatterbox, msg); 

/* Write a message using the pre-generated instance handle. */ 
status = Chat_ChatMessageDataWriter_write(chatterbox, msg, userHandle); 
checkStatus(status, "Chat_ChatMessageDataWriter_write"); 

sleep (1); /* do not run so fast! */ 
/* Write any number of messages, re-using the existing string-buffer: no leak!!. */ 
for (i = 1; i <= NUM_MSG && ownID != TERMINATION_MESSAGE; i++) { 
    msg->index = i; 
    snprintf (msg->content, MAX_MSG_LEN, "Message no. %d", msg->index); 
    printf("Writing message: %s\n", msg->content); 
    status = Chat_ChatMessageDataWriter_write(talker, msg, userHandle); 
    checkStatus(status, "Chat_ChatMessageDataWriter_write"); 
    sleep (1); /* do not run so fast! */ 
    } 

/* Write any number of messages, re-using the existing string-buffer: no leak!!. */ 
    for (i = 1; i <= NUM_MSG && ownID != TERMINATION_MESSAGE; i++) { 
     msg->index = i; 
     snprintf (msg->content, MAX_MSG_LEN, "Hi there, I will send you %d more exxpert_messages.", NUM_MSG); 
     snprintf (msg->content, MAX_MSG_LEN, "Message no. %d", msg->index); 
     printf("Writing message: %s\n", msg->content); 
     status = Chat_ChatMessageDataWriter_write(chatterbox, msg, userHandle); 
     checkStatus(status, "Chat_ChatMessageDataWriter_write"); 
} 

,但我的输出上面的代码如下:

Writing message: Hi there, I will send you 10 more messages. 
    Writing message: Message no. 1 
    Error in Chat_ChatMessageDataWriter_write: DDS_RETCODE_PRECONDITION_NOT_MET 
+0

上面显示的只是可用源代码的一部分 –

回答

0

当您注册一个DataWriter,类型InstanceHandle的值的情况下返回,就像在你的代码在这里:

userHandle = Chat_ChatMessageDataWriter_register_instance(chatterbox, msg); 

您只能将该userHandle变量用于随后的write(),且该变量具有与您注册的DataWriter相同的值。但是,您尝试执行以下操作:

status = Chat_ChatMessageDataWriter_write(talker, msg, userHandle); 

通知不同的变量chatterboxtalker。变量userHandle不属于talker DataWriter,因此失败返回值为PRECONDITION_NOT_MET

+1

我必须使用'userHandle'以不同的名称吗? @Reinier Torenbeek。例如'x_userHandle = Chat_ChatMessageDataWriter_register_instance(talker,msg);' –

+0

这是一种选择。或者,你可以完全忘记'userHandle'。从关于'write()'调用的DDS规范:_HANDLE_NIL的特殊值可用于参数句柄。这表明实例的身份应自动从实例_数据(通过密钥)推导出 ._ –