La phase d’initialisation d’un programme utilisant une interface graphique comporte un ensemble d’instructions qui mettent en place les divers composants interactifs de cette interface (fenêtres, boutons, cases à cocher, etc.). D’autres instructions définissent les messages d’événements qui devront être pris en charge : on peut en effet décider que le programme ne réagira qu’à certains événements en ignorant tous les autres.
Alors que dans un programme « textuel », la phase centrale est constituée d’une suite d’instructions qui décrivent à l’avance l’ordre dans lequel la machine devra exécuter ses différentes tâches (même s’il est prévu des cheminements différents en réponse à certaines conditions rencontrées en cours de route), on ne trouve dans la phase centrale d’un programme avec interface graphique qu’un ensemble de fonctions indépendantes. Chacune de ces fonctions est appelée spécifiquement lorsqu’un événement particulier est détecté par le système d’exploitation : elle effectue alors le travail que l’on attend du programme en réponse à cet événement, et rien d’autre[1].
Il est important de bien comprendre ici que pendant tout ce temps, le réceptionnaire continue à « tourner » et à guetter l’apparition d’autres événements éventuels.
S'il arrive d'autres événements, il peut donc se faire qu'une deuxième fonction (ou une 3e, une 4e...) soit activée et commence à effectuer son travail « en parallèle » avec la première qui n'a pas encore terminé le sien[2]. Les systèmes d'exploitation et les langages modernes permettent en effet ce parallélisme que l'on appelle aussi multitâche.
Au chapitre précédent, nous avons déjà remarqué que la structure du texte d'un programme n'indique pas directement l'ordre dans lequel les instructions seront finalement exécutées. Cette remarque s'applique encore bien davantage dans le cas d'un programme avec interface graphique, puisque l'ordre dans lequel les fonctions sont appelées n'est plus inscrit nulle part dans le programme. Ce sont les événements qui pilotent !
Tout ceci doit vous paraître un peu compliqué. Nous allons l'illustrer dans quelques exemples.
- ↑ Au sens strict, une telle fonction qui ne devra renvoyer aucune valeur est donc plutôt une procédure (cf. page ).
- ↑ En particulier, la même fonction peut être appelée plusieurs fois en réponse à l'occurrence de quelques événements identiques, la même tâche étant alors effectuée en plusieurs exemplaires concurrents. Nous verrons plus loin qu'il peut en résulter des « effets de bord » gênants.