Κατά την εργασία με πακέτο εργαλείων οργάνου, είναι σημαντικό να γίνει κατανοητό το υποκείμενο μοντέλο νήματος που χρησιμοποιείται για την ανάγνωση και αποστολή συμβάντων της πλατφόρμας GUI. Η υλοποίηση του νήματος περιβάλλοντος χρήστη επηρεάζει τους κανόνες που πρέπει να ακολουθούν οι εφαρμογές κατά τη χρήση νημάτων Java στον κωδικό τους.
Πίσω από κάθε εφαρμογή GUI, ανεξάρτητα από τη γλώσσα ή το πακέτο εργαλείων περιβάλλοντος χρήστη, η πλατφόρμα λειτουργικού συστήματος εντοπίζει συμβάντα GUI και τα τοποθετεί σε ουρές συμβάντων εφαρμογών. Παρόλο που η μηχανική ανάμεσα στις διαφορετικές πλατφόρμες λειτουργικών συστημάτων διαφέρει αρκετά, οι βασικές λειτουργίες είναι παρόμοιες. Όταν ο χρήστης πατά το ποντίκι, πληκτρολογεί χαρακτήρες ή εμφανίζει παράθυρα, το λειτουργικό σύστημα δημιουργεί συμβάντα εφαρμογών GUI, όπως πάτημα ποντικιού, πάτημα πλήκτρου ή συμβάντα παραθύρου ζωγραφικής. Καθορίζει το παράθυρο και την εφαρμογή που θα λάβει το κάθε συμβάν και το τοποθετεί στην ουρά συμβάντων της εφαρμογής.
Η υποκείμενη δομή για κάθε εφαρμογή GUI σε παράθυρο αποτελεί βρόχο συμβάντος. Οι εφαρμογές αποδίδουν αρχικές τιμές και στη συνέχεια εκκινούν ένα βρόχο, ο οποίος απλά διαβάζει τα συμβάντα GUI από την ουρά και αντιδρά ανάλογα. Κάθε εργασία που πραγματοποιείται κατά τη διάρκεια χειρισμού ενός από αυτά τα συμβάντα, πρέπει να ολοκληρωθεί γρήγορα έτσι ώστε το σύστημα GUI να συνεχίσει να αλληλεπιδρά με το χρήστη.
Οι μακρόχρονες λειτουργίες που ενεργοποιούνται αυτόματα από συμβάντα περιβάλλοντος χρήστη πρέπει να πραγματοποιούνται σε ένα ξεχωριστό νήμα έτσι ώστε το νήμα του βρόχου συμβάντος να μπορεί να επιστρέψει γρήγορα και να λάβει το επόμενο συμβάν από την ουρά της εφαρμογής. Ωστόσο, η πρόσβαση στα όργανα και το API πλατφόρμας από άλλα νήματα πρέπει να ελέγχεται με ρητό κλείδωμα και σειριακή διάταξη. Μια εφαρμογή που δεν είναι σε θέση να ακολουθήσει τους κανόνες μπορεί να προκαλέσει την αποτυχία κλήσης λειτουργικού συστήματος, ή, ακόμη χειρότερα, να κλειδώσει ολόκληρο το σύστημα GUI.
Το SWT ακολουθεί το μοντέλο νηματοποίησης που υποστηρίζουν απευθείας οι πλατφόρμες. Το πρόγραμμα εφαρμογής εκτελεί το βρόχο συμβάντος στο κύριο νήμα και αποστέλει συμβάντα απευθείας από αυτό το νήμα. Το νήμα περιβάλλοντος χρήστη είναι το νήμα στο οποίο δημιουργήθηκε η Εμφάνιση. Όλα τα άλλα όργανα πρέπει να δημιουργηθούν στο νήμα περιβάλλοντος χρήστη.
Καθώς ο κωδικός όλων των συμβάντων ενεργοποιείται αυτόματα από το νήμα περιβάλλοντος χρήστη της εφαρμογής, ο κωδικός εφαρμογής που χειρίζεται τα συμβάντα μπορεί να έχει ελεύθερη πρόσβαση στα όργανα και να πραγματοποιήσει κλήση γραφικών χωρίς κάποια ιδιαίτερη τεχνική. Ωστόσο, η εφαρμογή ευθύνεται για τη διακλάδωση υπολογιστικών νημάτων κατά τη διεξαγωγή μακρόχρονων λειτουργιών που ανταποκρίνονται σε ένα συμβάν.
Σημείωση: Το SWT θα ενεργοποιήσει αυτόματα μια κλάση SWTException για κάθε κλήση που πραγματοποιείται από νήμα που δεν αντιστοιχεί σε περιβάλλον χρήστη, ενώ θα έπρεπε να πραγματοποιείται απο το νήμα περιβάλλοντος χρήστη.
Το κύριο νήμα, συμπεριλαμβανομένου του βρόχου συμβάντων, για μια εφαρμογή SWT έχει την ακόλουθη δομή:
public static void main (String [] args) { Display display = new Display (); Shell shell = new Shell (display); shell.open (); // start the event loop. We stop when the user has done // something to dispose our window. while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); }
Μετά τη δημιουργία των οργάνων και το άνοιγμα του κελύφους, η εφαρμογή διαβάζει και αποστέλει τα συμβάντα από την ουρά του λειτουργικού συστήματος έως ότου το παράθυρο κελύφους αποδεσμευθεί. Αν δεν υπάρχουν διαθέσιμα συμβάντα στην ουρά, ορίζουμε την εμφάνιση ως αδρανή για να δοθεί η δυνατότητα σε άλλες εφαρμογές να εκτελεστούν.
Το SWT παρέχει μεθόδους ειδικής πρόσβασης για την κλήση του κωδικού οργάνων και γραφικών από ένα νήμα παρασκηνίου.
Οι εφαρμογές που επιθυμούν να καλέσουν κώδικα περιβάλλοντος χρήστη από ένα νήμα που δεν αντιστοιχεί σε περιβάλλον χρήστη πρέπει να παρέχουν ένα Εκτελέσιμο το οποίο καλεί τον κωδικό περιβάλλοντος χρήστη. Οι μέθοδοι syncExec(Runnable) και asyncExec(Runnable) στην κλάση Display χρησιμοποιούνται για την εκτέλεση αυτών των.εκτελέσιμων στοιχείων στο νήμα περιβάλλοντος χρήστη κατά τη διάρκεια του βρόχου συμβάντων.
Το ακόλουθο τμήμα κώδικα παρουσιάζει το μοτίβο για τη χρήση αυτών των μεθόδων:
// do time-intensive computations ... // now update the UI. We don't depend on the result, // so use async. display.asyncExec (new Runnable () { public void run () { if (!myWindow.isDisposed()) myWindow.redraw (); } }); // now do more computations ...
Όταν χρησιμοποιείτε τη μέθοδο asyncExec, καλό είναι να ελέγχετε αν το όργανο έχει αποδεσμευθεί από το εκτελέσιμο. Καθώς είναι δυνατό να πραγματοποιηθούν άλλες ενέργειες στο νήμα περιβάλλοντος χρήστη από τη στιγμή κλήσης της μεθόδου asyncExec
έως την εκτέλεση του εκτελέσιμου, ποτέ δε μπορείτε να είστε σίγουροι για την κατάσταση των οργάνων σας τη στιγμή που εκτελείται το εκτελέσιμο.
Οι κανόνες νημάτωσης είναι πολύ σαφείς κατά την υλοποίηση μιας εφαρμογής SWT από την αρχή, εφόσον είναι δυνατός ο έλεγχος της δημιουργίας του βρόχου συμβάντων και της απόφασης για την διακλάδωση υπολογιστικών νημάτων στην εφαρμογή.
Η συνεισφορά κωδικού πρόσθετης λειτουργίας στον πάγκο εργασίας είναι πιο πολύπλοκη. Οι ακόλουθοι κανόνες μπορούν να θεωρηθούν "κανόνες χρήσης" για τη χρήση κλάσεων της πλατφόρμας περιβάλλοντος χρήστη, παρόλο που ανάλογα με την έκδοση μπορεί να υπάρχουν εξαιρέσεις σε αυτούς τους κανόνες: