Σάββατο 20 Φεβρουαρίου 2016

Εγχειρίδιο της Μ2000 - Τεύχος 13ο

6.1.6 Χρήση Κράτα και Ξεκίνα στα Νήματα

Εδώ έχουμε ένα πρόγραμμα που κάνει την οθόνη του περιβάλλοντος του διερμηνευτή παράθυρο με δυνατότητα να το μετακινούμε. Την μετακίνηση την αναλαμβάνει ένα νήμα, καθώς μετακινούμε το παράθυρο ένα άλλο νήμα τυπώνει νούμερα σε μια οθόνη που έχουμε χωρίσει και το κάτω μέρος της ολισθαίνει. Παράλληλα με την εντολή Επιφάνεια αλλάζουμε την διαφάνεια τη οθόνης, κάνουμε δηλαδή το παράθυρο διάφανο κατά την κίνηση.

Για να λειτουργήσει το πρόγραμμα φτιάχνουμε δυο στόχους, όπου "ακούν" όταν ο δείκτης του ποντικιού τους είναι πάνω τους και πατάμε κάποιο πλήκτρο του ποντικού. Η σάρωση των στόχων για να δει το σύστημα ότι έχει πατηθεί στόχος γίνεται με εντολή που έχουμε επίσης σε ένα νήμα.

Ουσιαστικά τρέχει το Κύριο.Έργο ως ένα νήμα και δυο ακόμα, το νήμα για τους στόχους και το νήμα για τους αριθμούς που βλέπουμε να ολισθαίνουν την οθόνη. Ο ένας στόχος αλλάζει την τιμή της Γ και έτσι τερματίζει το Κύριο.Έργο. Ο άλλος στόχος ενεργοποιεί ένα νήμα το ΚίνησέΜε το οποίο για όσο πατάμε το πλήκτρο του δείκτη θα μετακινεί το παράθυρο, ενώ αν το αφήσουμε θα δώσει εντολή στον εαυτό του να σταματήσει (Νήμα Αυτό Κράτα). Για να ξεκινήσει παίρνει μια εντολή Νήμα ΚίνησέΜε Ξεκίνα, όπου η ΚίνησέΜε είναι η μεταβλητή χειρισμού του νήματος!
Η εντολή Άναψε χρειάζεται αν ξεκινήσουμε το πρόγραμμα απ΄ευθείας από το αρχείο gsb, γιατί το M2000.exe δεν εμφανίζει την οθόνη αν δεν έχει εισαγωγή ή δεν δώσουμε την Άναψε (να εμφανίσει δηλαδή τη διεπαφή του)
Πολλές εντολές βρίσκονται με Ctrl+F1 στην βοήθεια του διερμηνευτή (υπάρχει και το εμφανιζόμενο μενού στο διορθωτή που έχει την επιλογή βοήθεια, πρέπει να επιλέξουμε προς τα κάτω για να εμφανιστούν και οι άλλες εντολές. Το μενού βγαίνει και με απλό αριστερό κλικ στη γραμμή του διορθωτή)

Γενική Κατάσταση=0, Γ=Αληθές
Παράθυρο 10, 240*40,6000;
Πλαίσιο @ Πλάτος,0,4,1,0
Πλαίσιο @ Πλάτος,0,1,45,3
Δρομέας 0,0
Πένα 15
Στόχος A,"Κατάσταση++",Πλάτος-2,1,,,1," ΠΑΡΑΔΕΙΓΜΑ ΧΡΗΣΗΣ ΣΤΟΧΩΝ ΚΑΙ ΝΗΜΑΤΩΝ"
Νήμα {
      Κίνηση.Π Κίνηση.ΧΠ-ΜΧ+Δείκτης.Χ,Κίνηση.ΥΠ-ΜΥ+Δείκτης.Υ
      Αν Δείκτης=0 Τότε {
            Κατάσταση<=0: Νήμα Αυτό Κράτα : Επιφάνεια 255: Ανανέωση
      }
} Ως ΚίνησέΜε
Νήμα ΚίνησέΜε Κράτα
Νήμα ΚίνησέΜε Κάθε 100
Τύπωσε @( Πλάτος-2,0);
Πλαίσιο @ Πλάτος-2,0,4,15,0
Στόχος B, "Γ<=Ψευδες : Μπιπ" ,2,1,,,5,"<>"
Πένα 15
Άναψε
Οθόνη ,2
ΑΑ=1
Νήμα {
      Σάρωσε .01 \\ βλέπει τους στόχους
} Ως κκλ κάθε 20
Νημα {
      Τύπωσε ΑΑ
      ΑΑ++
} Ως ΚΚ καθε 30
Κύριο.Έργο 10 {
      Αν όχι Γ τότε έξοδος
      Αν Κατάσταση=1 Τότε {
            ΜΧ=Δείκτης.Χ : ΜΥ=Δείκτης.Υ
            Επιφάνεια 200 \\ βάζουμε διαφάνεια  200/255 *100%
            Νήμα ΚίνησέΜε Ξεκίνα
            Κατάσταση++
            }
}
Νήματα Σβήσε



6.1.7 Χρήση νημάτων κατά την εισαγωγή στοιχείων


Υπάρχει η Ξεκίνα για να γυρίσει η ροή στην αρχή του μπλοκ. Εδώ βάζουμε ένα νήμα (αυτόματο νήμα), να τρέξει μια φορά σε 5 δευτερόλεπτα
{
      Μετά 5000 {
            Εισαγωγή Τέλος
      }
      Τύπωσε "Δώσε Ονοματεπώνυμο:";
      Γραμμή Εισαγωγής Α$
      Νήματα Σβήσε
      Αν αποκ$(Α$)="" τότε Τύπωσε "Δώσε Κάτι" : Ξεκίνα
}


Πρέπει να σβήσουμε όλα τα νήματα  με το Νήματα Σβήσε, αν δεν έχουμε τίποτα άλλο να κάνουμε παρακάτω.


6.2 Επικοινωνία μέσω Αυλού.

Στα Windows οι Αυλοί είναι αρχεία τα οποία διατηρούνται στη μνήμη με όνομα, και σε αυτά μπορεί ένα πρόγραμμα να γράφει και ένα άλλο να διαβάζει. Μάλιστα για την ακρίβεια, μπορούν πολλά προγράμματα να γράφουν και ένα να διαβάζει (με την υλοποίηση που χρησιμοποιώ).
Οι Αυλοί στην Μ2000 μόνο "ακούν".  Δηλαδή δίνουμε ένα αλφαριθμητικό και στήνεται ένας αυλός που "ακούει" ασύγχρονα μέσω ενός αυτόματου νήματος.Τα προγράμματα που στέλνουν στοιχεία, ίσως αδυνατούν να στείλουν, λόγω καθυστερήσεων του δικτύου. Γυρνάει λάθος, και το βλέπουν και περιμένουν μόλις βρουν ευκαιρία θα στείλουν δεδομένα. Το μόνο που χρειάζονται τα άλλα προγράμματα (πελάτες) είναι τον αριθμό του αυλού.
Βέβαια εδώ θα σκεφτεί κανείς...πώς γίνεται να διαβάσει το πρόγραμμα πελάτης...Ο πελάτης θα διαβάσει στήνοντας τον δικό του αυλό και θα στείλει στον εξυπηρετητή το δικό του νούμερο αυλού.
Το όνομα του αυλού περιέχει και το όνομα του υπολογιστή. Έτσι ουσιαστικά το νούμερο συνδυάζεται με το όνομα υπολογιστή, Έτσι σε ένα δίκτυο, θα έχουμε σε κάθε υπολογιστή έναν αυλό που θα ακούει!
Στο παράδειγμα χρησιμοποιούμε την συνάρτηση αυλός$( ) η οποία συνδυάζει μια παράμετρο, τον αριθμό, με το όνομα του υπολογιστή για να επιστρέψει το όνομα του αυλού,

\\ Εξυπηρετητής - Πελάτης σε ένα πρόγραμμα!
\\
\\ Λ=12345 \\ Μπορούμε να δώσουμε το δικό μας νούμερο
Χρήση Αυλού στο Άλφα$ Ως Λ
\\ Ο πελάτης γνωρίζει το νούμερο Λ και στέλνει την πληροφορία
Αυλός Αυλός$(Λ), "Γιώργος  -  Привет игровая площадка!",2,3
\\ Ο Εξυπηρετητής περιμένει να πάρει κάτι στο Άλφα$
Ενώ Άλφα$="" {
      Αν Δείκτης Τότε Διέκοψε
      Αναμονή 10
      Τύπωσε "Αναμονή..."
}
\\ Μεταφέρουμε  τα στοιχεία στο σωρό
Σωρός Άλφα$, "ΓΓΓΑΑ"  \\ παίρνουμε τα πέντε πρώτα στοιχεία
Πέτα 2 \\ πετάμε τα δύο πρώτα
Διάβασε Α$, Α, Β
Τύπωσε Α$, Α, Β
Νήμα Λ Σβήσε
Νήματα  \\ για να δούμε αν έχουμε κάποιο νήμα να τρέχει.


Εδώ υπολογιστής εξυπηρετητή και πελάτη είναι ίδιος. Για να δούμε το όνομα υπολογιστή υπάρχει το Υπολογιστής$ που μας το δίνει αλλά φαίνεται και στο Αυλός$(1)
Π.χ. αν λέγονταν ο υπολογιστής BROTHER και είχαμε τον αυλό 1 το όνομά του θα ήταν αυτό:
"\\BROTHER\pipe\M1"

(έτσι τον φτιάχνει η Μ2000). Η εντολή Αυλός δέχεται το όνομα του αυλού, που μπορεί να δείχνει σε κάποιον υπολογιστή αλλά ενδέχεται να μην μπορεί να στείλει επειδή ο εξυπηρετητής έχει ήδη μήνυμα να "σηκώσει". Οπότε βάζουμε την εντολή Αυλός σε ένα μπλοκ Δες Οκ { } και αν δεν είμαστε οκ, τότε πάμε πάλι την αποστολή.


Παρατηρούμε ότι ο πελάτης δεν γνωρίζει πότε θα ελευθερωθεί ο εξυπηρετητής. Ο εξυπηρετητής χειρίζεται αυτόματα την εισαγωγή αλλά ενδέχεται να θέλει και αυτός να στείλει πίσω σε έναν πελάτη την απάντηση. Βάζουμε την επιστροφή σε ένα νήμα και εδώ αν πετύχει τότε σταματάμε το νήμα, αλλιώς το αφήνουμε την επόμενη φορά που θα κληθεί να δοκιμάσει ξανά. Επιπλέον ο εξυπηρετητής μπορεί να στέλνει αιτήματα σε βάση δεδομένων, διαδοχικά για κάθε πελάτη. Όλοι οι πελάτες πρέπει να κρατάνε κάποιον χρόνο για να δουν αν έχουν σύνδεση ή όχι! Αν ο χρόνος περάσει ένα όριο και δεν υπάρχει απάντηση τότε κάτι πρέπει να κάνει το πρόγραμμα για να ειδοποίηση ότι είναι OFF LINE,

Στον αυλό δεν περνάμε άμεσα πολλά στοιχεία, ουσιαστικά ένα κείμενο με 1000 χαρακτήρες είναι οκ. Αν θέλουμε να στείλουμε πολλά πεδία μπορεί να γίνει διαδοχικά. Στέλνουμε π.χ. αριθμό και στοιχείο και στέλνουμε το 0 για αριθμό τέλους. Το τι θα κάνουμε είναι δικό μας θέμα.

Στο παράδειγμα μπορούμε να το σπάσουμε σε δυο προγράμματα, βάζουμε το Λ στο 12345

και αφαιρούμε την γραμμή Αυλός Αυλός$(Λ), "Γιώργος - Привет игровая площадка!",2,3 και την βάζουμε σε ένα άλλο m2000.exe όπου πιο πριν έχουμε γράψει Λ=12345. Ξεκινάμε τον εξυπηρετητή, και βλέπουμε το "Αναμονή". Τρέχουμε την Αυλός και βλέπουμε τον Εξυπηρετητή να παίρνει το μήνυμα! Σε άλλο υπολογιστή π.χ. τον Me για εξυπηρετητή θα γράφαμε Αυλός "\\Me\pipe\M12345", "Γιώργος - Привет игровая площадка!",2,3 γιατί εκεί η Αυλός$(12345) θα έβαζε στην αρχή το όνομα του πελάτη. Αυτό το θέλουμε να το στείλουμε στον εξυπηρετητή για να μας απαντήσει!

(αν δώσουμε το Χρήση Αυλού στο Άλφα$ Ως Λ ώστε να έχουμε ένα προσωρινό χώρο φόρτωσης, στον πελάτη, και το Λ θα είναι ένα άλλο νούμερο, π.χ. το 1000! Δεν έχει σημασία το νούμερο, απλά μπορούμε να στείλουμε, όλο μαζί ως Αυλός(Λ)!

Πιο ανεβασμένο πρόγραμμα! Ο πελάτης είναι ένα νήμα τώρα και στέλνει διαδοχικά δυο πακέτα με έλεγχο σφάλματος! Χρησιμοποιεί τρεις στατικές μεταβλητές, και τον δικό του σωρό, που είναι ανεξάρτητα από οτιδήποτε άλλο στο τμήμα! Έβαλα και τον παράγοντα "απασχολημένο" για τον εξυπηρετητή. Δηλαδή ο εξυπηρετητής θα ικανοποιήσει την εισαγωγή όταν πατήσουμε το διάστημα! Μέχρι τότε θα προσπαθεί να στείλει ο πελάτης το επόμενο πακέτο!


\\ Εξυπηρετητής - Πελάτης σε ένα πρόγραμμα!
\\
\\ Λ=12345 \\ Μπορούμε να δώσουμε το δικό μας νούμερο
Χρήση Αυλού στο Άλφα$ Ως Λ
\\ Ο πελάτης γνωρίζει το νούμερο Λ και στέλνει την πληροφορία
Νήμα {
      Νήμα Θέσε Ονομα$, Π1,Π2
      Δες {
            Αν Όνομα$<>"" τότε {
                  Αυλός Αυλός$(Λ), Όνομα$,Π1,Π2
                  \\ αν βγει λάθος στην Αυλός θα βγούμε από το Δες
                  Όνομα$=""
                  Αν Κενό Τότε Νήμα Αυτό Σβήσε
            } Αλλιώς Διάβασε Όνομα$,Π1,Π2
      }


} Ως Κ Εκτέλεση Σειρά  "Γιώργος  -  Привет игровая площадка!",2,3 ,  "Άλλο",100,300
Νήμα Κ Κάθε 500
\\ Ο Εξυπηρετητής περιμένει να πάρει κάτι στο Άλφα$
Δες { \\ για να πιάσει το Διέκοψε
      Ενώ Δείκτης=0 {
            Ενώ Άλφα$="" {
                  Αν Δείκτης Τότε Διέκοψε
                  Αναμονή 10
                  Τύπωσε "Αναμονή...ή Πάτα πλήκτρο ποντικιού"
                }
           
       Ενώ Όχι Ενκομ$=" " {
             Τύπωσε "Αναμονή...ή Πάτα Διάστημα"
              Αναμονή
        }
                  Σωρός Άλφα$, "ΓΓΓΑΑ" \\ η Άλφα$ θα αδειάσει από πέντε στοιχεία
              \\    Χρήση Αυλού στο Άλφα$ Ως Λ
            Β=0
            Αν όχι Κενό Τότε {
                  Πέτα 2 \\ πετάμε τα δύο πρώτα
                  Διάβασε Α$, Α, Β
                  Τύπωσε Α$, Α, Β
            }
            Αν Β=300 Τότε Έξοδος
      }
}
Νήμα Λ Σβήσε
Νήματα  \\ για να δούμε αν έχουμε κάποιο νήμα να τρέχει.



Η μεταβλητή Άλφα$ δουλεύει ως FIFO. Ένα νήμα που φτιάχνεται με τη Χρήση Αυλού κοιτάει τι έχει ο αυλός και το σηκώνει και το μεταφέρει στο τέλος του Άλφα$. Εμείς διαβάζουμε από την αρχή του. Μέσα σε αυτό έχουν μπει σε μορφή "σωρού" δεδομένα. Θα δούμε για τα δεδομένα σε μορφή σωρού σε αλφαριθμητικό σε άλλο τεύχος. Εδώ απλά γνωρίσαμε ότι μπορούμε να βγάζουμε από αυτόν λέγοντας τι θέλουμε (αν αυτό που θέλουμε δεν υπάρχει τότε βγαίνει λάθος). Δηλαδή εδώ ζητάμε γράμματα τρεις φορές (Αλφαριθμητικά δηλαδή) και αριθμούς δυο φορές. Αυτά βγαίνουν από το αλφαριθμητικό και μπαίνουν στο σωρό και από εκεί τα διαβάζουμε σε μεταβλητές.

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

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

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