- Directive d'inclusion : #include ContinuousProcess.h
Les sous-classes de processus continus propres au système simulé sont déclarées et réalisées dans les fichiers typiquement nommés UserContinuousProcess.h et UserContinuousProcess.cc.
On indique en préambule qu'un processus continu ne peut être contrôlé que par les types d'action (directives) INIT, STOP ou PROCEED.
Pour chaque classe propre à son application, l'utilisateur doit essentiellement coder quatre méthodes (en plus de l'éventuelle fonction de précondition, décrite dans la classe Process) :
- Une fonction (nommée par exemple et arbitrairement MyProcess_Initialize) qui code l'initialisation des descripteurs des entités touchées par le processus. Le moteur de simulation, lorsqu'il rencontre dans un événement une directive INIT associée à un processus continu, invoque cette fonction d'initialisation.
- Une fonction qui code l'avancée du processus pour une période de un pas, c'est-à-dire les changements d'état des entités touchées par le processus. Le moteur de simulation, lorsqu'il rencontre dans un événement une directive PROCEED associée à un processus continu, invoque la méthode prédéfinie Proceed de la classe ContinuousProcess. Cette méthode fait avancer le processus pas par pas en enchaînant des appels à la fonction de changement d'état. Cette avancée est entretenue tant qu'il n'est pas nécessaire de l'interrompre, du fait de la présence dans l'agenda d'un événement prioritaire (au sens de la fonction attachée à la simulation par AssignBeforeInAgendaMethod). Dans cette situation le moteur de simulation :
- cesse d'invoquer dans Proceed la fonction de changement d'état,
- place dans l'agenda un nouvel événement de classe ProceedFromCurrentState avec pour seule conséquence un couple constitué du processus interrompu et d'une directive PROCEED. La date de ce nouvel événement est la date courante, c'est-à-dire celle à laquelle le processus a été interrompu et à partir de laquelle il doit être poursuivi. L'événement d'origine est détruit avec ses méthodes mais sans ses processus.
Il est important de noter que le pas est la durée d'une période pendant laquelle il est impossible d'interrompre la procédure de changement d'état du système. En conséquence, l'évolution de l'état à l'intérieur (strictement) de ce laps de temps ne peut servir de donnée de contrôle pour d'autres processus, ni être contrôlée par d'autres processus. Seules les valeurs d'état en début et en fin du laps de temps pourront servir au contrôle du système. L'utilisateur doit établir les valeurs de pas en tenant compte de cela, notamment lorsque la bonne synchronisation des processus régissant le système est exigée. Bien entendu, la fonction d'avancée du processus sur un pas peut être codée comme une boucle, avec incrémentation d'un ``pas'', mais ce dernier est un ``pas'' interne, sans rapport avec le pas du processus (qu'on peut maintenant qualifier d'externe).
Noter aussi que si un événement doit intervenir, non pas au moment même où est invoquée la fonction d'avancée d'un processus continu, mais pendant son exécution, alors (i) la fonction est effectivement invoquée une dernière fois, (ii) un événement de reprise du processus continu est programmé à la date d'effet du changement, puis enfin (iii) l'événement qui aurait dû intervenir pendant le changement d'état est déclenché (avec un retard minimal, inférieur ou égal au pas du processus continu).- Une fonction qui code l'arrêt du processus, invoquée par le moteur de simulation, lorsqu'il rencontre dans un événement une directive STOP associée à un processus continu. Elle peut aussi être invoquée explicitement dans une partie quelconque du code écrit par l'utilisateur.
- Le constructeur de la classe, dans lequel l'utilisateur doit appeler le constructeur de la classe de base, avec le symbole (et éventuellement le nom de classe) qu'il associe à la classe en argument. Par exemple :
MyProcess::MyProcess() : ContinuousProcess(MY_SYMBOL) { ... };Dans ce constructeur ou en dehors, l'utilisateur doit impérativement doter le processus des fonctions d'initialisation, d'avancée de un pas et d'arrêt. Par exemple :
SetInitialize(MyProcess_Initialize); SetGoOneStepForward(MyProcess_GoOneStepForward); SetStop(MyProcess_Stop);