Author: Bob Jacobsen
Keywords: JMRI technical code threading

# JMRI: Liaison

La grande majorité des codeurs JMRI (et programmeurs) n'ont pas à se soucier des liaisons. Leur code se trouve invoqué, et appelle un autre code, et la laison prend soin d'elle-même. Cela est particulièrement vrai pour le code basé sur les événements, qui répond à des événements provenant par exemple de l'interface graphique ou du changement d'un objet sur le réseau, et appelle des méthodes concernant d'autres objets, qui peuvent à leurs tours créer plus d'événements.

Cette simplicité vient de l'utilisation d'un seul lien pour le traitement de la plupart de l'activité de JMRI: Le fil des événements Java Swing.

Notez que ceci ne signifie pas que d'autres choses ne peuvent pas survenir. Par exemple, ce fragment de script:

        state = sensors.provideSensor("mySensor").getState()

        turnouts.provideTurnout("myTurnout").setState(THROWN)

        print state == sensors.provideSensor("mySensor").getState()

peut imprimer soit vrai ou faux, parce que car la modification de l'aiguillage peut changer instantanément les capteurs associés.

Il y a des moments où vous pouvez vouloir faire des choses un peu plus complexes avec l'utilisation d'un lien supplémentaire:

- Vous pouvez vouloir mettre un processus gourmand en temps dans un lien séparé pour garder le reste de JMRI réactif.
- La meilleure manière de coder un l'état d'une machine qui dialogue avec le matériel du réseau pourrait être d'utiliser un lien séparé.
- Vous pourriez être l'interface avec un autre code existant qui utilise des liens

Nous préférerions que vous manipuliez les questions de liaison qui se posent dans ce cas par l'intermédiaire de la clase jmri.util.ThreadingUtil. ThreadingUtil fournit des utilitaires qui rendent cela aisé pour appeler les fonctions nécessaire sur le bon lien.

Par exemple, si vous voulez lire un tas de données venant d'un fichier, passer quelque temps à le modifier, et puis créer une fenêtre pour le montrer, vous pouvez vouloir faire tout ce travail sur un lien séparé. À la fin, quand il est temps de rendre visible votre travail, vous devez le faire sur le lien Swing ( GUI ). Voici le code pour le faire:

        frame = new JmriJFrame();  // frame declared as instance variable

        // spend a long time reading data and configuring the frame

        ThreadingUtil.runOnGUI( ()->{  frame.setVisible(); });

ThreadingUtil sépare les opérations sur le lien GUI ( par ex Java Swing ) et les opérations sur le réseau ( ex: Capteurs, Aiguillages, etc ). Il n'y a pas de vrai différence maintenant, mais dans l'interêt peut-être d'avoir besoin un jour de les séparer, nous introduisons maintenant les deux versions. SVP essayez de choisir la bonne la plupart du temps l'une lors du codage.

( N.B: Vous trouverez beaucoup de cas plus anciens qui utilisent explicitement javax.swing.SwingUtilities.invokeLater( r ) ou javax.swing.SwingUtilities.invokeAndWait( r ); Ceux-ci seront migrés vers les nouvelles méthodes spécifiques JMRI à l'avenir pour garder notre code juste un petit peu plus propre et plus souple.)