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:
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 variableThreadingUtil 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.
// spend a long time reading data and configuring the frame
ThreadingUtil.runOnGUI( ()->{ frame.setVisible(); });
( 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.)