Articolo pubblicato sul n. 90 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nel novembre 1989
Amighevole: Le nuove funzioni ADPmttb (cfr. MC n. 88) presentate questo mese riguardano la spedizione e ricezione di messaggi di tipo stringa e il controllo del non determinismo. La funzione che ci permetterà di spedire una qualsiasi stringa (null terminated) ad un altro processo è la Send. Accetta tre soli parametri e precisamente il modo di spedizione (MODE_SYNC, MODE_ASYNC o il nuovo MODE_RVE), la porta mttb su cui spedire il messaggio e il messaggio stesso ovvero il puntatore alla stringa da spedire. Analogamente, la funzione Receive permette di aspettare (o non aspettare) una stringa in arrivo su una porta. I parametri della Receive sono ancora 3 ovvero il modo di ricezione (MODE_WAIT, MODE_NOWAIT o, ancora, MODE_RVE), la porta da cui prelevare l'eventuale messaggio e una variabile stringa per contenere il messaggio in arrivo. Per i quattro modi già conosciuti vi rimando all'articolo pubblicato su MC di settembre. Il nuovo MODE_RVE (utilizzabile solo con Send e Receive) implementa la forma di comunicazione a rendez-vous esteso. Utilizzando questo modo (che deve essere impostato nella Send e nella Receive implicate) chi effettua la Send ordina al processo che aspetta sulla Receive di spedirgli il messaggio. Si ha, in pratica, un capovolgimento dei ruoli con la differenza però che il processo che esegue la Receive sta lì ad aspettare che qualche altro processo lo interroghi e la risposta è spedita effettivamente all'autore della Send chiunque esso sia. Per capire meglio, facciamo un piccolo esempio: il processo Pippo crea una sua porta Pluto per spedire la data odierna a chi gliela chiede. AI suo interno troveremo una istruzione (magari all'interno di un loop) di questo tipo: Receive(MODE_RVE, "Pluto", DataDiOggi); dove DataDiOggi è una stringa contenente appunto la data. Qualsiasi processo può eseguire a questo punto una: Send(MODE_RVE, "Pluto", variabile); per ottenere al suo ritorno una copia di DataDiOggi nella sua 'variabile' . Le rimanenti due funzioni, MultiReceive e MultiWait permettono di attendere eventi su più porte (massimo 5). Con la prima potremo effettivamente ricevere fino a 5 messaggi contemporaneamente (sempre di tipo stringa null terminated) con la seconda, di uso più generale, semplicemente aspettare su fino a 5 porte l'arrivo di un qualsiasi messaggio che poi preleveremo (se lo riterremo opportuno) con la funzione apposita (Receive, ReceiveBlock, ReceiveChar, ReceivePointer, ecc. ecc.). La sintassi in tutt'e due i casi è molto semplice. Per la MultiReceive dovremo indicare innanzitutto il modo di ricezione (il solito MODE_WAIT o MODE_NOWAIT). il numero di porte su cui operare e poi una sequenza di coppie "porta, variabile» come nelle normali Receive. Ad esempio con la linea: MultiReceive(MODE_WAIT, 3, "Pippo", varl, "Pluto", var2, "Minnie", var3); aspetteremo su almeno una delle tre porte citate messaggi di tipo stringa da porre nelle variabili indicate. Da notare che se tutt'e tre le porte contengono messaggi, al ritorno dalla funzione troveremo in ogni variabile' il relativo messaggio arrivato, se arriva un solo messaggio ne troveremo uno nella variabile corrispondente (stringa vuota nelle altre) e così via per ogni possibile combinazione: è una vera e propria lettura parallela delle n porte indicate (con 'n', ripeto, minore o uguale a 5). Indicando MODE_NOWAIT come primo parametro, avremo l'effetto di ritrovare tutte stringhe vuote se al momento della chiamata tutte le porte indicate non contengono messaggi. La sintassi della MultiWait è un tantino più semplice: si indica solo il numero delle porte su cui operare e la lista delle porte interessate. Da questa funzione si torna non appena una o più porte presentano messaggi in arrivo. Tutto qui. Impaginato originale... Articolo pubblicato su www.digiTANTO.it - per ulteriori informazioni clicca qui |