Architettura: modello ad eventi
In un ambiente tradizionale l’applicazione ha il controllo del flusso per la maggior parte del tempo e quando ha bisogno di un servizio chiama il sistema operativo
In Windows abbiamo invece un’architettura guidata da eventi : il sistema gestisce il flusso operativo e chiama l’applicazione quando necessario.
Si parla di modello "Don’t call me I call you" (Hollywood Model)
Questa impostazione è comune a quasi tutti gli ambienti basati su GUI (per esempio Macintosh).
Architettura: messaggi e finestre
Evento: azione dell’utente (mouse tastiera) , interazione con una periferica (arrivo di un carattere sulla porta seriale o su un socket)
Ogni evento provoca l’invio di un messaggio ad una o più applicazioni (in Win16 una coda unica per tutte le applicazioni, in Win32 una coda per ogni applicazione)
Messaggi: base della comunicazione fra applicazioni e fra finestre di un’applicazione
In Windows una finestra è un’entità in grado di ricevere e elaborare messaggi.
Ogni finestra è identificata da un’handle (hwnd) che viene restituita dal sistema all’atto della creazione e che serve come ID per ogni successiva interazione, compreso l’invio di messaggi.
Un messaggio è una piccola struttura dati che contiene informazioni sull’evento associato (ID, 2 parametri di tipo int, valore di ritorno)
Architettura Windows: callback
Il meccanismo di callback consente ad una DLL di chiamare una funzione all’interno di un’applicazione
L’applicazione passa alla DLL un puntatore ad una sua funzione
La DLL usa questo puntatore per chiamare la funzione
Il meccanismo di callback consente l’implementazione del sistema di mesaggi/eventi
Ogni finestra ha una funzione di callback (Window Procedure) che viene usata dalle DLL di sistema per inviare i messaggi
Modello ad eventi e multitasking
Questo tipo di modello permette di realizzare una forma di pseudo-multitasking che viene chiamata "cohoperative multitasking".
In Win16 in realtà abbiamo un solo processo e il flusso operativo è sequenziale. Il meccanismo di dispatching dei messaggi (un’unica coda per tutte le applicazioni) consente simulare la concorrenza.
Se un’applicazione entra in un loop all’interno di una risposta ad un messaggio (cioè in WndProc), tutto il sistema rimane bloccato
In Win32 si ha invece un multitasking effettivo (prehemptive): ogni applicazione è un processo ed ha una propria coda di messaggi.
Uno scheduler provvede ad assegnare una "fetta" di tempo ai vari processi attivi sulla base di un sistema di priorità
Oltre a ciò ogni processo può avere più threads (processi "leggeri" con memoria condivisa).
L’API Win32 mette a disposizione una serie di strumenti di sincronizzazione per i threads: mutex, semafori, sezioni critiche ...
Risorse
Le applicazioni Windows fanno uso di immagini (bitmap), cursori, icone ecc.
Queste "risorse" vengono create esternamente e poi inserite dal linker nell’eseguibile (EXE o DLL).
In pratica un eseguibile contiene una sezione di codice e un database di risorse.
Esistono funzioni di API che permettono di caricare e utilizzare queste risorse
Per la creazione il metodo "classico" prevede la stesura di un file .RC con le definizioni (esiste un linguaggio specifico). Il compilatore di risorse RC.EXE crea un file .RES pronto per il linker.
In pratica si usano degli editor di risorse generano direttamente file .RES
E’ possibile anche editare gli EXE e le DLL e modificare quindi a posteriori gli eseguibili. E’ utile per le traduzioni in quanto anche le stringhe di testo possono essere inserite fra le risorse.
Hello Windows: struttura
Vediamo il classico programma "Hello World" in versione Win32
hellowin.c comprende due funzioni
WinMain() - entry point del programma