Behaviours
Un Behaviour est l’unité de comportement d’un agent. Chaque behaviour
tourne dans son propre thread à l’intérieur du processus child de l’agent.
Hiérarchie
Behaviour
├── SimpleBehaviour
│ ├── OneShotBehaviour action() appelé une fois, done() = true
│ ├── CyclicBehaviour action() en boucle infinie, done() = false (final)
│ ├── WakerBehaviour attend N ms puis appelle onWake()
│ └── TickerBehaviour appelle onTick() toutes les N ms
└── (direct) done() libre à surcharger → usage recommandé
Utilisation
Créer un behaviour
class MyBehaviour : public Behaviour {
int count_ = 0;
public:
MyBehaviour(Agent* ag) : Behaviour(ag) {}
void action() override {
// logique du comportement
count_++;
}
bool done() override {
return count_ >= 10; // arrêt après 10 itérations
}
void onStart() override { /* appelé avant la boucle */ }
void onEnd() override { /* appelé après la boucle */ }
};
Enregistrer dans setup()
void MyAgent::setup() override {
addBehaviour(new MyBehaviour(this));
}
Avertissement
TickerBehaviour et CyclicBehaviour ont done() déclaré final.
Si tu as besoin d’un comportement avec arrêt conditionnel, hérite directement
de Behaviour.
TickerBehaviour
class MyTicker : public TickerBehaviour {
public:
MyTicker(Agent* ag) : TickerBehaviour(ag, 1000) {} // 1000 ms
void onTick() override {
std::cout << "tick!\n";
}
// done() est final → tourne indéfiniment
};
WakerBehaviour
class MyWaker : public WakerBehaviour {
public:
MyWaker(Agent* ag) : WakerBehaviour(ag, 5000) {} // déclenche après 5s
void onWake() override {
std::cout << "réveillé!\n";
}
};
Parallélisme
Tous les behaviours d’un agent tournent en threads parallèles dans le processus child. L’agent attend la fin de tous ses behaviours avant de s’arrêter.
child process
├── thread : control_Thread
├── thread : listener_extern_signals_Thread
├── thread : control_message (POSIX MQ)
├── thread : Behaviour A ─┐
├── thread : Behaviour B ├── parallèles
└── thread : Behaviour C ─┘