Δευτέρα 7 Δεκεμβρίου 2015

Τμήματα και Νήματα (απλό παράδειγμα) (Αναθ.107)

Νέα αναθεώρηση 107 (διορθώθηκε το Κομ$ όταν περιμένουμε πάτημα πλήκτρου ενώ τρέχει νήμα στο περιθώριο - κάποια φορά σταμάταγε η ροή των νημάτων, και βγαίναμε μόνο με Esc)
Έχουμε δυο μέρη. Αυτό το γράφουμε σε ένα τμήμα με Σ Α αντιγράφουμε το παρακάτω, βγαίνουμε με Esc και το τρέχουμε με Α
(πάντα έχουμε το Esc για διαφυγή, και με Τέλος στη γραμμή εντολών τερματίζουμε το m2000.exe)
Στο δεύτερο μέρος τρέχουν τρία νήματα ΑΑ, ΒΒ, ΓΓ
Στο ΓΓ κάνουμε κράτηση του ΑΑ περιμένουμε ένα πλήκτρο και το αφήνουμε να συνεχίσει, ενώ το ΒΒ συνεχίζει να λειτουργεί
Το Κύριο.Έργο είναι και αυτό νήμα αλλά δείτε τι γίνεται.Όσο λειτουργεί η Κομ$ δεν βρίσκει η ΕνΚομ$ πλήκτρο για να κάνει έξοδο.
Αν κάνουμε Έξοδο από το Κύριο.Έργο τότε τα νήματα του τμήματος παίρνουν εντολή να σταματήσουν (καλό είναι να έχουμε μια αναμονή π.χ. ΑΝΑΜΟΝΗ 1000 ενός δευτερολέπτου για να δώσουμε χρόνο να βγουν από τη λίστα νημάτων).

Προσθήκης της Μέρος { } ως μεταβλητή η οποία όταν τρέχει δεν αφήνει άλλο μέρος με ίδια μεταβλητή να τρέξει, δηλαδή το προσπερνάει. Στα νήματα μας ενδιαφέρει τι μπορεί να γίνει και όχι ο χρόνος που θα γίνει επακριβώς. Για το λόγο αυτό βλέπουμε τα νήματα ως "Ασύγχρονη" λειτουργία.

Χωρίς τις δομές Μέρος {} Ως  θα είχαμε το εξής φαινόμενο..Κατά την εμφάνιση της λίστας υπάρχει περίπτωση το σύστημα να αποφασίσει να εκτελέσει το επόμενο νήμα. Οπότε πριν τελειώσει η εντολή ΛΙΣΤΑ μπορεί να τρέξει το νήμα ΒΒ. Η εντολή Λίστα τρέχει στη κλήση που κάνουμε στην Άλφα στο νήμα  ΓΓ. Έτσι ενώ θα τρέξει το ΒΒ δεν θα εκτελέσει την τύπωσε γιατί η Μέρος την προσπερνάει. Παίζει βέβαια το ανάποδο; Όχι δεν παίζει εδώ γιατί το ΒΒ τρέχει χωρίς να δώσει αυτό χρόνο στο σύστημα (έχουμε εξ ορισμού Σχέδιο.Νημάτων Διαδοχικό). Δηλαδή εδώ τυχαίνει να δίνουμε εκτός σχεδίου κλήση νήματος (μπορεί και να μην γίνει..Τα νήματα πρέπει για να τρέξουν να είναι διαθέσιμα, δηλαδή να μην τρέχουν ήδη, και ο χρόνος που τα καθορίζει με τη "κάθε", το χρονικό διάστημα να έχει περάσει, και το οποίο μετράει από εκκίνηση σε εκκίνηση).


\ Τμήμα Α (Υποθέτουμε ότι αυτό το κείμενο είναι στο Α)
\ Γεγονότα:
\ Ένα τμήμα μπορεί να έχει άλλα τμήματα
\ Κάθε τμήμα μπορεί να έχει τρεις παρουσίες:
\* τυπικός ορισμός σε κείμενο->υπαρκτό τμήμα σε λίστα->εκτελέσιμο αντικείμενο *\
\ 1. Το Βήτα υπάρχει στον ορισμό του Άλφα  (τυπικός ορισμός)
\ 2. Τρέχει το Άλφα και εγγράφει σε λίστα το Βήτα (υπαρκτό τμήμα)
\ 2.1. Όταν το Άλφα τερματίσει θα το σβήσει από τη λίστα!
\ 3. Το Βήτα τρέχει σε αντίγραφο σε αντικείμενο εκτέλεσης,
\     εφόσον ισχύει το 2  (εκτελέσιμο τμήμα)
\ 3.1. Το Άλφα είναι σε αναμονή στο σημείο της κλήσης
\ 3.2. ...Κώδικας όμως του Άλφα δύναται να τρέχει σε νήμα
\ 3.3. ...Ένα νήμα είναι εκτελέσιμο αντικείμενο με τυπικό ορισμό από το τμήμα
\ 3.4  ...Δεν υπάρχει εγγραφή σε λίστα (δεν έχουν όνομα) αλλά χειριστή (handler)
\ 3.5 ....Τρέχουν όταν υπάρχουν συνθήκες (όπως το Κύριο.Έργο που δίνει χρόνο σε Νήματα)
\ 3.6 ....Λέμε ότι κώδικας του Άλφα τρέχει σε νήμα επειδή το νήμα που ορίστηκε στο Άλφα,
\ 3.7 ....και έγινε αντικείμενο, βλέπει τα πάντα με ονόματα στο Άλφα εκτός από το σωρό.
\ 3.8 ....Έτσι αν ένα νήμα καλέσει τμήμα τότε θα του δώσει το δικό του σωρό
\ 3.9 ....Με αυτόν τον τρόπο δεν μπερδεύται η είσοδος - έξοδος σε παράλληλες διαδικασίες.
\ 4. Η μεταβλητή κ δεν είναι ορατή στο τμήμα Βήτα
\ 4.1. Αυτό που είναι ορατό είναι ο ειδικός σωρός τιμών
\ 4.2. Η Βήτα μπορεί να αφήσει κάτι σε αυτόν (μια ή περισσότερες τιμές)
\ 4.3. Κοινό σωρό έχουν όσα τμήματα βρίσκονται στη σειρά κλήσης
\ 4.4 Το ΔείξεΜου έχει κοινό σωρό με αυτόν που την καλεί!
\ 4.5 Ο Σωρός συνδέεται στο αντικείμενο εκτέλεσης,
\ 4.6 Άρα το τμήμα Βήτα στον ορισμό της Άλφα
\ 5. Το τμήμα βλέπει ότι φτιάχνει και ότι είναι γενικό
\ 5.1. Εδώ βλέπει το Δέλτα αλλά όχι την κ του Άλφα, ούτε τη κ του Α
\ 5.2. Εδώ δεν βλέπει το Άλφα, αφού δεν είναι γενικό
Τμήμα Γενικό ΔείξεΜου {
      Σωρός   ' πάντα βγαίνει με Μη αναλογική γραφή.
      Λίστα ! ' με θαυμαστικό δείχνει σε αναλογική γραφή τις μεταβλητές
      Τμήματα ? ' εδώ όπως και να έχει θα βγουν με αναλογική γραφή
}
κ=10
Τμήμα Αλφα {
      κ=1234321
      Δες οκ {Βήτα 40 }
      Τύπωσε όχι οκ '' Δεν έχει ακόμα εγγραφεί στη λίστα
      Τμήμα Γενικό Δέλτα {
            Τύπωσε "Δύναμη Δ", Αριθμός*3
      }
      Τμήμα Βήτα {
            Διάβασε Α '' 2
            Βάλε Α**2, "Οκ"   '' Κορυφή Σωρού "Οκ", ακολουθεί το 4
            Τύπωσε Όχι Έγκυρο(κ) ' -1 ναι δεν το γνωρίζει!
            Δέλτα 3
            ΔείξεΜου
      }
      Βήτα 10*Αριθμός '' 10*1/5
      Φέρε 2 ' φέρνω το δεύτερο στοιχείο του σωρού στη κορυφή
      Σωρός  ' Εδώ βλέπω το Σωρό μου!
      Τύπωσε Αριθμός, Γράμμα$ ''4  Οκ
      Τύπωσε κ ' 1234321
}
Αλφα 1/5
Δες οκ { Αλφα.Βήτα 10 } '' είναι λάθος δεν υπάρχει Άλφα.Βήτα
Τύπωσε όχι οκ
Δες οκ {Δέλτα 10 } '' είναι λάθος δεν υπάρχει η Δέλτα
Τύπωσε όχι οκ
Τύπωσε κ ' 10
Α$=Κομ$ \\ αναμονή κομβίου - Πλήκτρου
\\ Το κύριο έργο είναι νήμα και αυτό
Καθαρό Μόνο_του
Λ=100
Νήμα {κ++ : Τύπωσε κ} Ως ΑΑ κάθε 10
Νήμα {
      Μέρος {
            Τύπωσε "Είμαι Εδώ"
      } ως Μόνο_του
} Ως ΒΒ κάθε 500
Νήμα {
      Αν κ>Λ τότε {
      Λ+=100
      Νήμα ΑΑ Κράτα
       μερος {
            Αλφα 1/5
            } ως Μόνο_του
      Τύπωσε Κομ$
      Νήμα ΑΑ Ξεκίνα
      }


} Ως ΓΓ κάθε 10
Κύριο.Έργο 20 {
      Αν ΕνΚομ$<>"" Τότε Έξοδος ' Το Ενα Κομβίον - ΕνΚομ$ δεν περιμένει αλλά κοιτάει τι πατήθηκε
}



Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.