联邦中的时间只能向前推进,因此一个成员只能请求推进到一个大于或等于它的当前逻辑时间,一个成员为了能推进它的逻辑时间,它应该显示地进行请求推进,直到RTI发出一个许可,推进才会发生。
只有时间控制成员才可以发送TSO消息;只有时间约束成员才能接收TSO消息。
一个时间控制成员不能发送一个时戳小于当前逻辑时间加前瞻时间:
如:
RTIfedTime Lookahead(1.1);//时间前瞻量为1.1(秒)
RTIfedTime clqCurrentTime(0);//初始成员逻辑时间为0
而它发送的带时戳消息为clqCurrentTime+1<1.1:如下
_rtiAmbassador.updateAttributeValues(_ObId, *attrs,clqCurrentTime+1, "shuru");
一个成员能发送带时戳大于等于当前逻辑逻辑时间加前瞻时间,加入成员A发送带时戳为5的消息,而此时成员B的当前逻辑时间为1,此时成员B是接收不到带时戳为5的消息,只有当成员不停的向前推进到它的逻辑时间为5,它才可能接收到这个带时戳为5的消息(之前消息是被RTI保存在它的一个对列中的)。
RTIfedTime Lookahead(1.1);//时间前瞻量为1.1(秒)
RTIfedTime clqCurrentTime(0);//初始成员逻辑时间为0
上述是成员A的时间前瞻量和它的逻辑时间,可以说该成员现在可以自由推进到逻辑时间1如: {//请求时间推进
_rtiAmbassador.timeAdvanceRequest(clqCurrentTime+1);
}
catch(RTI::Exception &e)
{
cout<<"Time advance error:"<<&e<<endl;
exit(1);
}
而不用理会其他成员有没有推进,也就是说一个逻辑成员它能自由推进到的逻辑时间必须小于它的当前逻辑时间加时间前瞻量。
当然成员A的这种自由推进的次数是有限制的:
(1) 如果联邦中有时间控制成员,那么成员A的自由推进次数只有一次,此后只能申请推进,却不能推进成功。
(2) 如果联邦中没有时间控制成员,那么成员A的自由推进次数是无限的,当然成员A在自由推进的过程中带时戳的消息只有等到接受方推进到该成员的逻辑时间等于其他成员发送消息带的时戳。
而当成员A的初始如下:
RTIfedTime Lookahead(0.1);//时间前瞻量为0.1(秒)
RTIfedTime clqCurrentTime(0);//初始成员逻辑时间为0
那么如果此时它执行了:
{//请求时间推进
_rtiAmbassador.timeAdvanceRequest(clqCurrentTime+1);
}
catch(RTI::Exception &e)
{
cout<<"Time advance error:"<<&e<<endl;
exit(1);
}
如上的函数,它只是申请了推进,但它没有推进成功,因为,RTI不允许它推进,为什么会不允许它推进呢,原因是:如果此时联邦中又有另外一个成员B发送一个带时戳1的消息,,而此时A成员已经推进到逻辑时间,那么它将永远不会接受到这个消息,因为联邦允许接受TSO消息的成员能接受的最小带时戳的消息为成员当前逻辑时间加它的时间前瞻量。RTI能允许联邦中成员推进是考虑到联邦中不会有发送方成员发送的带消息的时戳大于有接受方成员接受的带消息的时戳。