Cet usage de la fonction DeferCall() consiste effectivement à faire appeler la fonction flashingLED() par elle-même mais comme ça résulte en une séquence d'appels, avec un délai (1/4 de seconde dans ce cas), ça ne risque pas de s'empiler de manière incontrôlée. Ca ne fait que 4 appels par seconde ... Occupation CPU = 0 dans le TaskManager.
Pour ce qui est de REXEC(), il s'agit d' une macro interne à TARGET qui utilise également DeferCall() en boucle ... qu'il s'agit bien d'arrêter un jour ou l'autre
DeferCall() est un timer à 1 coup qui appelle une fonction lorsque le temps spécifié est écoulé.
Le
& devant flashingLED() veut dire "adresse de" variable (ou de fonction), c.a.d. une case mémoire dans laquelle il y a soit une valeur a utiliser
(variable) ou du code à exécuter
(fonction) ... C'est un héritage du language C qui permet de passer l'adresse d'une fonction à une fonction ... tout est permis ... dans la mesure où on comprend ce qu'on fait ... et ça peut occuper quelques dizaines d'années sans en trouver les limites
Quant à DeferCall(FLASHING_INTERVAL_MS,
EXEC("flashingLED();"), 0); la seule chose à retenir c'est que ça ne
doit pas marcher et que si ça fait quand même quelque chose sans générer d'erreur et bien ce serait une grosse
connerie de la part de TM...
- EXEC() est un macro-commande, ce qui veut dire qu'une prédigestion de l'interpréteur du script doit remplacer EXEC(...) par du "vrai code".
- DeferCall() ne peut supporter que l'adresse mémoire d'une fonction comme deuxième argument.
1 + 2 = ERREUR ... CQFD
D'une manière plus générale, je dirais que ces macros internes (mots tout en majuscules) ne doivent apparaitre que dans les instructions du genre MapKey() qui sont prêtes à les traiter... C'est l'interpréteur qui va récupérer le code équivalent et - peut-être - le compiler pour en faire une fonction dont il mettra l'
&adresse à la place. Mieux vaut en limiter l'usage et les réserver aux seuls cas illustrés dans le manuel.