同步(Synchronization)
NAOqi提供两个本地同步方法。同步与远程模块不兼容。
回调同步
所有模块都有onPreProcess和onPostProcess方法。模块可以自由地调用这些方法,用户也可以自由地进行定义。请参见模块说明书来了解回调是否使用。在V1.2.0版,只有器件信息交流管理器使用回调。
注意: | Aldebaran模块的回调是阻塞式的。请注意模块循环时间。如果回调执行时间过长,机器人可能会摔倒。 |
---|
用户回调的定义:
void myCallBack(void) { // client algorithm } getParentBroker()->getProxy("ModuleToSynchronizeWith")->getModule()->atPreProcess(myCallBack); getParentBroker()->getProxy("ModuleToSynchronizeWith")->getModule()->atPostProcess(anotherCallBack); // use boost::bind to connect a class method.
Aldebaran模块样本:
this->PreProcess()(); // module processing this->PostProcess()();
有条件的同步
有条件的同步是异步的。用户线程在一个条件上等待,Aldebaran模块向条件发送一个信号。
// condition creation to call in module constructor void ALModule::addSynchronizer(const std::string &pSynchronizerName); // wait on condition void ALModule::waitSynchronizer(const std::string &pSynchronizerName); // signal condition void ALModule::signalSynchronizer(const std::string &pSynchronizerName);
条件还可以帮助C++和Python语言同步。