Voici le premier chapitre d'une serie de tutoriaux sur la programmation sous Windows.
Les pre-requis pour pour pouvoir suivre correctement ces petits documents sont juste
une connaissance correcte du C. Je ferais un petit apparté pour présenter un peu quelques
concepts du C++ puisque beaucoup de ces concepts se retrouvent sous Windows.
Introduction :
Tout d'abord, pour ce qui est de la programmation sous Windows, plusieurs manieres de faire
sont possibles, plus ou moins accessibles et rapides a maitriser :
La programmation sous Windows en utilisant les MFCs : les MFCs ( ou Microsoft
Fundation Classes ) sont des ensembles de classes ( pour avoir des explications sur ce
qu'est une classe voir a la fin de ce chapitre ) de base permettant de programmer
plus ou moins aisement sous Windows. Un des avantages de ces classes est qu'elles permettent
de developper une application assez rapidement grace a un ensemble d'outil aidant a la
mise en place du code general. Par contre, elles demandent une bonne connaissance du C++, sont entierement
proprietaires ( Microsoft oblige ) et surtout sont assez lourdes et compliquees a BIEN
comprendre ( Je me demande d'ailleurs si le temps soit disant gagne en les utilisant
n'est pas perdu a parfaire la maitrise qu'on en a ).
La programmation dite "SDK Win32" qui utilise le SDK ( Software Development Kit ou Kit
de Developpement Logiciel ) de Windows. Malgré quelques vagues notions
de C++, la solution offerte par le SDK est plus "propre" et plus facile a controler
au niveau du code final obtenu mais il faut dans ce cas tout faire soit meme. Il s'agit
en fait d'un ensemble de fonctions de type C qui repondent directement a des besoins precis
( un SDK quoi ! ).
J'ai choisi d'utiliser la deuxieme solution tout simplement parce que c'est la plus simple. Je
ferai peut etre un article ou deux sur la programmation utilsant les MFCs, on verra.
Mais entrons donc dans le vif du sujet.
1. La programmation sous Windows : un point de vue different.
Contrairement a DOS qui est un environement mono-tache, mono-utlisateur par excellence, Windows
depuis la version 95 est un vrai OS 32 bits et multi-tache pouvant ainsi gerer plusieurs "taches"
simultanement.
Tiens faisons un petit arret sur la notion de "tache" a proprement parler.
Une tache est un flot d'execution associé a un certain nombre de structures de base.
Regardons ca de maniere generale tout d'abord. Lorsque vous lancez un programme quelconque,
un processus est cree a partir de ce programme par le systeme d'exploitation.
Un processus est une structure d'execution comprennant en gros :
Le code de votre programme,
La pile de donnee de votre programme,
Les donnees propres a votre programme ( variables, ... ).
Et d'autres informations ( droits, ... ),
Chaque processus possede son propre espace adressable et ignore completement celui du processus
voisin par differentes méthodes de protection mémoire ( MMU, ... ) sur lesquelles je ne veux pas
m'etendre ici vu que ce n'est pas le sujet.
Windows gère ainsi un grand nombre de ces processus simultanément et leur donne sucessivement,
selon une politique d'ordonnancement donnée, le droit à s'éxécuter L'UN APRES L'AUTRE sur le processeur. Et oui !
Multi-tâche ne veut pas dire "environement où les programmes s'éxécutent en parallèle et SIMULTANEMENT les uns
par rapport aux autres". En effet, le nombre de processeurs etant en général limité, Windows et
les OS multitaches en général, ne peuvent que SIMULER un environement vraiment multitâche
en sautant très vite d'un processus à l'autre pour que le processeur puisse executer le code
correspondant. Le processus de passage d'un processus a l'autre est appele "changement de
contexte" (context switching) ou le mot contexte designe en fait le contexte d'execution du code associé au processus
( defini par les structure ci-dessus : pile de donnée, donnée du processus, etc ... ). Ce
changement de contexte, qui arrive à chaque fois que Windows decide de faire s'executer un autre processus
que celui qui est actuellement éxécute par le processeur, est
en général assez lourd en perte de temps. Il demande de toute facon toujours au moins un minimum
de temps pour que le nouveau contexte soit chargé ( pour vous donner une idee, sous QNX qui est
un OS temps reel, ce que Windows n'est pas, les temps de changement de context sont de l'ordre de
quelques dizaines de micro-secondes ).
Passons maintenant à la notion de thread, un Thread est un "processus léger" en ce sens qu'il est ... plus léger qu'un processus normal :). Plus sérieusement,
un thread est un flot d'éxécution interne à un processus, ... oula ca devient un peu
farfelu. Précisons un peu les choses, je vous ai dis qu'un processus possèdait son propre
espace adressable complètement indépendant de celui des processus voisins. Et bien, un Thread
s'éxécute dans l'espace adressable de son processus "père" et possède, par contre, sa
propre pile d'éxécution. Qu'est ce que ça veut dire ? Et bien un thread a acces à TOUTES les
variables du processus qui lui a donné naissance, ce que ne peut pas faire un processus avec
un processus voisin. Un processus peut ainsi consister en l'execution de un ou plusieurs threads
pouvant partager les memes variables. Un processus est ainsi constitué au moins d'un thread
d'éxécution : le thread primaire. Et une tâche est, dans ce contexte, un thread. Voila, en gros, on y reviendra plus en profondeur ( en regardant plus en détail l'ordonnancement de
ces threads et les différentes politiques proposées par Windows ) plus tard dans un tutorial
prochain.
Un petit schéma pour appuyer ces quelques phrases :