Originariamente pubblicato in data 16/05/1999
A
C
C
O
M
A
Z
Z
I
Via con levento
Via con levento
In ogni momento, il nostro computer è pronto a gestire molti eventi diversi: possiamo scrivere in una finestra, selezionare un menu, inserire un disco... come fa?
Visitando le meraviglie nascoste nei computer Apple, abbiamo scoperto come sia possibile per un programma utilizzare le risorse fornite dai progettisti della macchina. Centinaia di miniprogrammi, raggruppati a decine secondo lo scopo che realizzano, costituiscono il toolbox (scatola degli attrezzi) che è memorizzato nelle memorie Rom permanenti dei Macintosh e di Apple IIgs.In questa seconda puntata scopriremo come viene realizzato un programma che fa uso del toolbox introducendo un secondo tool: Event manager. Pensate per un momento al programma più venduto al mondo: Lotus 1-2-3, croce e delizia di qualche milione di utenti Ibm.
Il programma, come migliaia d'altri, è strutturato secondo un sistema di menu. Da un menu generale è possibile scegliere una delle svariate opzioni; attraverso una serie di menu successivi si finisce per specificare quale operazione (tra le centinaia possibili al programma) deve compiere il computer. Si passa quindi a scegliere l'oggetto, se necessario, sul quale l'operazione va eseguita.
Anche AppleWorks, a sua volta programma alfiere della famiglia Apple II con qualche milione di copie in circolazione, ha una struttura basata su menu successivi: ma questa filosofia non vale con i programmi basati sul Toolbox. Secondo la terminologia Apple, i programmi tradizionali sono detti modali, perché attraverso i menù l'utente seleziona un modo di operazione (il modo inserimento, il modo correzione, il modo stampa eccetera). Nei sistemi Apple, invece, i programmi sono non modali: tutte le opzioni sono sempre disponibili contemporaneamente, grazie ai menu a discesa, alle icone degli strumenti e ad altri oggetti manipolabili con il mouse.
PC tradizionali PC Apple
Programma modale usato con Programma non modale con tutte le
menu successivi opzioni sempre disponibili
Scelta l'azione, si seleziona Si seleziona con il mouse un oggetto,
un oggetto cui applicarla poi si indica l'azione
E' necessario ricordare un nome L'oggetto è rappresentato da una
per l'oggetto e scriverlo alla icona in vista che viene cliccata
tastiera con il mouse
Queste scelte hanno conseguenze dirette sulla struttura dei programmi. Nei programmi modali si arriva, come abbiamo detto, a selezionare una determinata azione. A livello di programma, a quella azione corrisponde una procedura (una routine) che la eseguirà.
In un programma non modale le cose non possono funzionare similmente. Per rendercene conto pensiamo a come avviene un taglia ed incolla in AppleWorks e in Gs Write (o Mac Write): nel primo caso mentre stiamo selezionando il testo da tagliare appare la scritta "Usa le frecce per selezionare il blocco, poi batti Return", e subito dopo vediamo apparire la scritta "Muovi il cursore alla nuova posizione, poi batti Return". Con Gs Write invece eseguiamo il "taglio" del testo e susseguentemente siamo liberi di copiarlo, ma tra le due operazioni possiamo compierne altre senza porci problemi. AppleWorks, programma modale, ci mette nel modo taglia e incolla, mentre Gs Write è un programma non modale.
Il programma non modale vede l'azione dell'utente attraverso il verificarsi di eventi : la pressione di un tasto è un evento, così come lo è l'inserimento di un dischetto o la ricezione di un testo attraverso la rete AppleTalk. C'è anche un evento speciale, nullEvent, che viene segnalato quando non è avvenuto nessun altro evento.
Gli eventi riconosciuti dai programmi attraverso lo event manager.
nullEvent 0 Non è accaduto nulla
mouseDown 1 E' stato premuto il pulsante del mouse
mouseUp 2 E' stato rilasciato il pulsante del mouse
keyDown 3 E' stato premuto un tasto
keyUp 4 E' stato rilasciato un tasto
autoKey 5 Un tasto con ripetizione resta premuto
updateEvt 6 Una finestra deve venire ridisegnata
diskEvt 7 E' stato inserito un disco
activateEvt 8 Una finestra è stata attivata
switchEvt 9 Switch tra applicazioni
networkEvt 10 Abbiamo ricevuto un messaggio da AppleTalk
deskAccEvt 10 Un accessorio di scrivania richiede attenzione
driverEvt 11 Evento riguardante una periferica (stampante o altro)
appEvt -- Un qualunque evento definito dall'applicazione
Apriamo una parentesi tecnica per gli addetti ai lavori: l'evento è normalmente un fatto di natura hardware, che il computer percepisce in conseguenza di un'azione accaduta nel mondo esterno; quelli tra i nostri lettori che conoscono un poco di programmazione assembler noteranno che nella maggior parte dei casi la Cpu del computer recepisce gli eventi come interrupt. Ma non in tutti i casi! Per Macintosh la pressione di un tasto genera un interrupt, mentre per Apple IIgs questo non avviene; ciononostante in entrambi i computer l'evento viene trattato in maniera identica. Il concetto di evento è dunque una evoluzione logica del concetto di interrupt.
Il programma non deve prestare attenzione all'arrivo degli interrupt, ma deve semplicemente trattarli quando è pronto a farlo. E' uno dei tool del toolbox che tratta gli eventi, e che li riceve facendo gli onori di casa. Lo Event manager prende nota degli eventi, memorizzandone le caratteristiche che i progettisti americani hanno chiamato, a rischio di uno scioglilingua: what, where, when e how. Consultate la tabella 3.
Tabella 3
La carta di identità di un evento lo descrive compiutamente e permette all'applicazione di trattarlo in modo corretto.
Event.what Il codice (tra quelli della tabella 2) che descrive l'evento
Event.when Il momento in cui l'evento è avvenuto
Event.where Dove si trovava il mouse quando l'evento è avvenuto
Event.modifiers Quali tasti di modifica (command, option, control, shift...)
erano premuti quando è avvenuto l'evento
Message Il messaggio dell'evento: codice del tasto battuto, oppure
testo ricevuto in reteAppleTalk o altro ancora...
Event manager incolonna gli eventi in una coda, una coda simile a quella che si forma ai caselli autostradali, dove gli eventi aspettano che l'applicazione li tratti in modo adeguato. L'applicazione utilizza la chiamata GetNextEvent dello Event manager per scoprire che eventi sono disponibili, ed Event manager allora trasmette all'applicazione il pacchetto what-where-... relativo al primo evento in coda. Se non ci sono eventi per l'applicazione, essa riceve lo speciale evento nullEvent. Per comprendere la diversità tra l'approccio tradizionale e quello reso possibile dallo Event manager osserviamo come potrebbe venire realizzato un semplice programma per disegnare sullo schermo nei due approcci:
Programma tradizionale:
Ripeti:
Leggi il mouse
Se il pulsante è premuto, esegui (Disegna un punto)
Finché non viene premuto il tasto ESC
Esci dal programma
Definizione di procedure:
Disegna un punto: traccia (X, Y, nero)
Leggi il mouse: ricava le coordinate X ed Y dallo hardware
Esci dal programma: ritorna il controllo al sistema operativo
Programma con Toolbox:
Non fare nulla finché non arriva un evento.
Se l'evento è MouseDown:
QuickDraw, disegna il punto Evt.Where!
Se l'evento è KeyDown e Message è Esc:
Sistema Operativo, esegui la funzione Quit
Altrimenti
Sound manager: esegui la quinta di Beethoven mentre aspettiamo
Naturalmente, non tutte le applicazioni debbono rispondere a tutti gli eventi. L'evento KeyUp non è usato da nessuna applicazione che il sottoscritto conosca, tant'è vero che normalmente lo Event manager viene istruito in modo da non immettere neppure nella coda gli eventi di quel tipo. Gli eventi MouseUp di solito sono significativi solo quando si sta trascinando una icona o si sta tracciando un rettangolo di selezione, cioè quando si stanno compiendo eventi complessi che sono direttamente manipolati dal Toolbox senza che l'applicazione debba preoccuparsene.
Una applicazione può chiedere ad Event manager di non segnalare neppure gli eventi che non interessano - per esempio, un word processor potrebbe sdegnare gli eventi relativi alla rete. Tuttavia, normalmente una applicazione permette a tutti gli eventi di venire incolonnati e si limita a non agire quando ne riceve qualcuno che non le interessa, perché gli eventi in più potrebbero essere utili a qualche accessorio di scrivania.
Armati con la conoscenza di Tool locator e Event manager, possiamo finalmente scoprire qualche trucco avanzato per l'uso del nostro computer.
Cominciamo subito ad esaminare come rimediare alle "bombe" più diffuse. Come sapete, quando avviene un errore fatale, un errore che il computer non è in grado di trattare, appare una videata caratteristica con la bomba e un codice d'errore. Il messaggio è normalmente "Sorry, a fatal system error occurred" (cioè "Spiacente, è accaduto un errore fatale"). Questo messaggio, per usare un eufemismo, non è utilissimo: ricorda spiacevolmente ai più la sensazione di sentirsi pestare un piede mentre qualcuno vi dice "mi scusi, le ho pestato un piede".
Il codice è un numero: normalmente ha la stessa utilità del foglietto di istruzioni in giapponese che avete trovato insieme al compact disk player regalato a Natale.
Da oggi in poi, però, potrete interpretare quel codice numerico, in modo da rimediare se possibile alle condizioni d'errore: nelle tabelle 4 e 5 sono indicati svariati codici - non tutti, perché prima di comprenderne alcuni dovremo parlare di altri tool del toolbox, cosa che avverrà nelle prossime puntate.
Tabella 4.
Il codice d'errore che appare, accompagnato dalla scritta "ID=", quando Mac bomba, può darci modo di rimediare all'incresciosa situazione.
1, 2 o 3: Al processore sono stati fatti eseguire dei dati.
4: E' stata eseguita una divisione per zero senza che l'applicazione trattasse il caso
9: Il Trap dispatcher non è riuscito a trattare una richiesta.
10: Ad un processore 68000 è stato fatto eseguire un programma creato per il processore 68020 e successivi
12: A Trap dispatcher è stato richiesto un tool che non esiste. State evidentemente usando una versione del System obsoleta che non contiene tutti i tool: sostituitela.
17-24: Il sistema operativo non è riuscito a caricare dal disco un package (un tool basato su memoria Ram). Valgono le osservazioni dell'errore 12.
25: E' stata esaurita la memoria.
27: Dischetto danneggiato: è stato trovato un riferimento ad un blocco di numero troppo grande
28: Lo stack ha invaso lo heap. E' una condizione di esaurimento memoria analoga alla numero 25.
41: Il Finder manca o è danneggiato.