Les instances de processus possèdent par construction des méthodes (instances de la classe Method) dont les corps codent ... :
- Directive d'inclusion : #include Process.h
Ces corps de méthodes sont vides à la construction du processus. On leur affecte ensuite une valeur (qui est un pointeur sur une fonction écrite par l'utilisateur), par des invocations de SetPrecondition, SetExec, SetInitialize, SetGoOneStepForward ou SetStop. Par une convention propre à DIESE, ces corps prennent comme seul argument la méthode elle-même :
- une fonction de précondition,
- et des fonctions d'éxécution (processud ponctuels), et d'initialisation, d'avancée et d'arrêt (processus continus).
void myProcess_execProcess_Body(ProcessMethod* pM);Comme on prend soin, avant son invocation, de doter la méthode d'un pointeur sur le processus qu'elle décrit, ce processus est accessible dans le corps par un message DescribedContinuousProcess() ou DescribedDiscreteProcess() adressé à la méthode (voir la page 'Attributs fonctionnels : les méthodes') :
DiscreteProcess* pDP = pM->DescribedDiscreteProcess();L'entité attachée au processus
Un processus opère un changement d'état sur le système simulé par les fonctions d'éxécution, d'initialisation et d'avancée. C'est le code de ces fonctions qui détermine quelles entités du système sont touchées par le processus. Il faut cependant spécifier avant leur invocation ce qu'on va appeler "l'entité cible" du processus. Sa valeur est renvoyée par la méthode ProcessedEntity :
Entity* pPE = pDP->ProcessedEntity();Cette entité est typiquement la seule que va toucher le processus, mais elle peut aussi n'être qu'une entité touchée parmi d'autres, ou bien encore n'être qu'un point de repère dans la structure du système à partir duquel le code des fonctions va rechercher la ou les entités touchées. L'entité cible du processus peut être déterminée de deux manières :
- en la désignant explicitement, comme argument de la méthode ProcessedBasicEntity appliquée au processus :
Process* pDP = new MyDiscreteProcess(); Entity* pE = new MyEntity(); pDP->ProcessedEntity(pE);- en la spécifiant de manière fonctionnelle : c'est alors une instance d'EntitySpec (spécification d'ensemble d'entités) qui est passée en argument de la méthode ProcessedEntitySpec appliquée au processus. La spécification doit avoir le mode RETURN_INSTANCES, le quantificateur NFIRST et l'effectif 1 :
Process* pDP = new MyDiscreteProcess(); EntitySpec* pES = new MyEntitySpec(); pES->SetMode(RETURN_INSTANCES); pES->IntQuantity(1); pDP->ProcessedEntitySpec(pES);L'expansion de la spécification (vois la page 'Spécifications d'ensembles d'entités') est réalisée dans la méthode d'accès ProcessedEntity si et seulement si une entité cible n'a pas été désignée explicitement.