Πέμπτη 3 Μαρτίου 2016

Αναθεώρηση 177 (Σημαντική)

Σε αυτήν την αναθεώρηση διόρθωσα σφάλματα με το κώδικα για τα Γεγονότα και τροποποίησα το κώδικα για να είναι πιο γρήγορος στις κλήσεις, και επίσης να δέχεται κλήση γεγονότος μέσα σε ρουτίνα που κλήθηκε από κλήση γεγονότος ( αυτό λέγεται φωλιασμένη κλήση γεγονότος ή  nested raise event).

Παρακάτω είναι δυο παραδείγματα που έχουν την ίδια έξοδο, αλλά στο παράδειγμα 1 έχουμε το γεγονός Inform ως γενικό και το καλούμε μέσα στην OnSpaceHandler() που καλείται από το OnSpaceBar γεγονός (δυο συνεχόμενα δηλαδή, το δεύτερο είναι γενικό)
Στο άλλο παράδειγμα περνάμε με αναφορά το τοπικό γεγονός και το καλούμε πάλι μέσα από την OnSpaceHandler(). Η διαφορά είναι ότι έχουμε μια παράμετρο ακόμα, την αναφορά στο τοπικό γεγονός.
Και στα δύο παραδείγματα, όταν καλούν τα αντικείμενα τύπου γεγονότα τις συναρτήσεις διεκπεραίωσης (ή χειρισμού), τότε αυτές τρέχουν μέσα στο αντικείμενό τους Info και ενημερώνουν τις μεταβλητές του, οι οποίες είναι ιδιωτικές. Δηλαδή δεν μπορούν να αλλαχτούν παρά μόνο από συναρτήσεις/τμήματα που θα καλέσουμε (άρα δημόσια).

Παράδειγμα 1


Event OnSpaceBar {
      Read t, a$, b
}
Group Info {
Private:
      counter, complete
Public:
      Event WorkEnd { }
      Function Print {
            read a$
            print a$
            .counter++
      }
      Function WorkEnd {
            .complete++
      }
      Module TotalPrint {
            Print "Total Lines:", .counter
            Print "Complete Works:", .complete
      }
}
Global Event Inform {
      read a$
}
Event Inform New Info.Print()
Event Info.WorkEnd New Info.WorkEnd()


Function OnSpaceHandler {
      Read thr, t$, kk
      Thread thr execute data t$, kk
      call event Inform "ok....................."
}
Event OnSpaceBar New OnSpaceHandler()


Thread {
      Static a$, payload, t
      If t=0 Then {
            call event Inform "no job......yet"
            If Not Empty Then {
                  Event OnSpaceBar Hold
                  Read a$, payload
                  t=payload
            }
       } Else {
            call event Inform format$("working {0:2}%",(payload-t)/payload*100)
             t--
             If t<1 Then Event OnSpaceBar Release : Call Event Info.WorkEnd
       }      
} As theThread Interval 50
Main.Task 50 {
      select case inkey$
      case ""
            call event Inform "wait...."
      case " "
            Call Event OnSpaceBar, theThread, "hello", 30
      else
            break
      end select
}
Threads Erase
Info.TotalPrint



Παράδειγμα 2


Event OnSpaceBar {
      Read &Ev, t, a$, b
}
Event Inform {
      read a$
}
Group Info {
Private:
      counter, complete
Public:
      Event WorkEnd { }
      Function Print {
            read a$
            print a$
            .counter++
      }
      Function WorkEnd {
            .complete++
      }
      Module TotalPrint {
            Print "Total Lines:", .counter
            Print "Complete Works:", .complete
      }
}
Event Inform New Info.Print()
Event Info.WorkEnd New Info.WorkEnd()


Function OnSpaceHandler {
      Read &inf, thr, t$, kk
      Thread thr execute data t$, kk
      call event Inf "ok....................."
}
Event OnSpaceBar New OnSpaceHandler()


Thread {
      Static a$, payload, t
      If t=0 Then {
            call event Inform "no job......yet"
            If Not Empty Then {
                  Event OnSpaceBar Hold
                  Read a$, payload
                  t=payload
            }
       } Else {
            call event Inform format$("working {0:2}%",(payload-t)/payload*100)
             t--
             If t<1 Then Event OnSpaceBar Release : Call Event Info.WorkEnd
       }      
} As theThread Interval 50
Main.Task 50 {
      select case inkey$
      case ""
            call event Inform "wait...."
      case " "
            Call Event OnSpaceBar, &inform, theThread, "hello", 30
      else
            break
      end select
}
Threads Erase
Info.TotalPrint



Και εδώ με ελληνικές εντολές το παράδειγμα 2, έχω διατηρήσει τα αναγνωριστικά μεταβλητώ/συναρτήσεων κ.ο.κ με τα αγγλικά

Γεγονός OnSpaceBar {
      Διάβασε &Ev, t, a$, b
}
Γεγονός Inform {
      Διάβασε a$
}
Ομάδα Info {
Ιδιωτικό:
      counter, complete
Δημόσιο:
      Γεγονός WorkEnd { }
      Συνάρτηση Print {
            Διάβασε a$
            Τύπωσε a$
            .counter++
      }
      Συνάρτηση WorkEnd {
            .complete++
      }
      Τμήμα TotalPrint {
            Τύπωσε "Total Lines:", .counter
            Τύπωσε "Complete Works:", .complete
      }
}
Γεγονός Inform Νέο Info.Print()
Γεγονός Info.WorkEnd Νέο Info.WorkEnd()


Συνάρτηση OnSpaceHandler {
      Διάβασε &inf, thr, t$, kk
      Νήμα thr Εκτέλεση Σειρά t$, kk
      Κάλεσε Γεγονός Inf "ok....................."
}
Γεγονός OnSpaceBar Νέο OnSpaceHandler()


Νήμα {
      Στατικές a$, payload, t
      Αν t=0 Τότε {
            Κάλεσε Γεγονός Inform "no job......yet"
            Αν Όχι Κενό Τότε {
                  Γεγονός OnSpaceBar Κράτησε
                  Διάβασε a$, payload
                  t=payload
            }
       } Αλλιώς {
            Κάλεσε Γεγονός Inform Μορφή$("working {0:2}%",(payload-t)/payload*100)
             t--
             Αν t<1 Τότε Γεγονός OnSpaceBar Άφησε : Κάλεσε Γεγονός Info.WorkEnd
       }      
} Ως theThread Κάθε 50
Κύριο.Έργο 50 {
      Επίλεξε Με inkey$
      Με ""
            Κάλεσε Γεγονός Inform "wait...."
      Με " "
            Κάλεσε Γεγονός OnSpaceBar, &inform, theThread, "hello", 30
      Αλλιώς
            Διέκοψε
      Τέλος Επιλογής
}
Νήματα Σβήσε
Info.TotalPrint




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

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

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