Τετάρτη 21 Νοεμβρίου 2018

Αναθεώρηση 9 Έκδοση 9.5

Σε αυτήν την αναθεώρηση έφτιαξα δυο πράγματα:
1. Το αντικείμενο Mutex ή Μοναδικό. Δεν υπάρχει ένα όνομα για αυτό το αντικείμενο στα ελληνικά και έτσι έβαλα ένα που σχετίζεται με αυτό που είναι. Είναι ένα αντικείμενο που υπάρχει για όσο το έχουμε φτιάξει στο λειτουργικό με σκοπό να το έχει "μοναδικό" μόνο μια εφαρμογή με συνέπεια άλλες να μην μπορούν να το πάρουν δικό τους, άρα να μην εκτελέσουν αυτό που έχουν να κάνουν μέχρι να απελευθερωθεί.
Το παρακάτω το γράφουμε σε ένα τμήμα έστω Α, με την Σ Α,  το σώνουμε με την Σώσε αλφα και ανοίγουμε δεύτερη φορά το διερμηνευτή και το φορτώνουμε ξανά.
Σκοπός μας είναι να τρέξουμε σε ένα από τα δύο το Αλφα και να το αφήσουμε στην αναμονή για πλήκτρο (α$=Κομ$). Πάμε στο άλλο και το ξεκινάμε και βλέπουμε ότι τερματίζει αμέσως!
Το μ1 είναι το αντικείμενο που κρατάει όλα τα μοναδικά. Αν ξεκάχουμε το Destroy (είναι στα αγγλικά όπως και οι μέθοδοι στις φόρμες) θα το κάνει το αντικείμενο μ1. Δεν μπορεί να γίνει Create αν έχει γίνει αλλού με το ίδιο όνομα.

Όρισε μ1 Μοναδικό
Δες {
      Μέθοδος μ1, "CREATE", "ALFA"
      Τύπωσε "Κάνε κάτι"
      α$=Κομ$
      Τύπωσε "Τελείωσε"
      Μέθοδος μ1, "DESTROY", "ALFA"
}


Declare M Mutex
try {
      Method M, "CREATE", "ALFA"
      Print "Do Something"
      a$=key$
      Print "Done"
      Method M, "DESTROY", "ALFA"
}


Επίσης διορθώθηκε ένα σημείο που δεν το είχα προσέξει πολύ, το πέρασμα με αναφορά σε εξωτερικές βιβλιοθήκες για τους ακέραιους τύπου Μακρύς (Long). Μπορούσαμε να περνάμε διευθύνσεις μέσω των διαρθρώσεων μνήμης (δες ΔΙΑΡΘΡΩΣΗ στη βοήθεια), αλλά για απλούς αριθμούς βολεύει η χρήση του & για το πέρασμα με αναφορά. Για τις φόρμες και τα γεγονότα τα περάσματα με αναφορά δουλεύουν σωστά.  Όπως επίσης το πέρασμα με αναφορά για αλφαριθμητικά δουλεύει σωστά (όπως και δούλευε).

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

Αυτή χωρίς αναφορά έχει το πλεονέκτημα να μας δίνει πολλούς αριθμούς, στην ουσία γεμίζοντας μια έκταση σε bytes με τυχαία σειρά δυαδικών ψηφίων. Εδώ έχουμε ορίσει τη διάρθρωση ή Buffer μνήμης σε έκταση δυο αριθμών τύπου μακρύς, δηλαδή 2*4=8 bytes.

Module checkit {
      Declare random1 lib "advapi32.SystemFunction036" {long lpbuffer, long length}
      Buffer Clear Alfa as long*2
      Print Eval(Alfa,0)
      Print Eval(Alfa,1)
      call void random1(alfa(0), 8)
      Print Eval(Alfa,0)
      Print Eval(Alfa,1)
}
checkit

ή νέα μορφή για έναν μόνο αριθμό τύπου μακρύ:
Module checkit {
      Declare random1 lib "advapi32.SystemFunction036" {long &lpLong, long length}
      Long A=0
      call void random1(&A, 4)
      Print A
}
checkit

Με χρήση προχωρημένων συναρτήσεων! Μπορούμε να ορίσουμε γενικές τις εξωτερικές βιβλιοθήκες, καθώς και τις σταθερές.

Declare Global CryptAcquireContext Lib "advapi32.CryptAcquireContextW" {Long &hProv, pszContainer$,pszProvider$, long dwProvType, long dwFlags}
Declare Global CryptReleaseContext Lib "advapi32.CryptReleaseContext" {Long hProv, Long dwFlags}
Declare Global CryptGenRandom Lib"advapi32.CryptGenRandom" {Long hProv, Long dwLen, Long &ByRef}
Global Const PROV_RSA_FULL As Long = 1
Global Const VERIFY_CONTEXT As Long = 0xF0000000&
 
Function  Random2 {
      Long Rand=0, hProv=0
      Call void CryptAcquireContext(&hProv, "", "", PROV_RSA_FULL, VERIFY_CONTEXT)
      Call Void CryptGenRandom( hProv, 4&, &Rand)
      Call Void CryptReleaseContext(hProv, 0&)
      =Rand
}
Print Random2()



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

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

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