MTR 86 W32
MTR 86 W32
MTR 86 W32
Page -II-
1.3. Accs et installation des ports E/S sous Windows NT et 2000 ........................ 3
Etat dun pilote de port E/S pour NT .............................................................. 3
Etat dun pilote de port E/S pour 2000 ........................................................... 3
Installation dun pilote pour port E/S .............................................................. 3
1.4. Taille des piles des tches................................................................................ 4
1.5. Utilisation des bibliothques standard C et C++............................................... 4
1.6. Utilisation de la bibliothque E/S console conio ............................................... 4
1.7. Gestion des priorits avec Mtr86 ...................................................................... 4
1.8. Rsolution de l'horloge ..................................................................................... 6
1.8. Rsolution de l'horloge ..................................................................................... 7
2. DIAGRAMME D'ETAT DE MTR86 ................................................................... 7
Page -III-
deverrouille .................................................................................................. 18
m_send ........................................................................................................ 19
5.3. Gestionnaire de tches rythmes................................................................... 19
t_cree ........................................................................................................... 19
t_start ........................................................................................................... 20
t_stop ........................................................................................................... 20
5.4. Gestion des vnements................................................................................ 20
e_cree .......................................................................................................... 20
e_close......................................................................................................... 20
e_wait........................................................................................................... 21
e_signal........................................................................................................ 21
5.5. Gestionnaire de rendez-vous ......................................................................... 22
rv_cree ......................................................................................................... 22
rv_close........................................................................................................ 22
rv_signal....................................................................................................... 23
rv_init ........................................................................................................... 23
5.6. Gestionnaire de tubes .................................................................................... 23
p_open ......................................................................................................... 23
p_close......................................................................................................... 24
p_write ......................................................................................................... 24
p_read.......................................................................................................... 24
p_plein ......................................................................................................... 25
p_vide .......................................................................................................... 25
p_openEx..................................................................................................... 25
p_closeEx .................................................................................................... 25
p_writeEx ..................................................................................................... 26
p_readEx...................................................................................................... 26
p_pleinEx ..................................................................................................... 26
p_videEx ...................................................................................................... 26
5.7. Gestionnaire de ressources ........................................................................... 27
r_cree........................................................................................................... 27
r_close ......................................................................................................... 27
r_wait ........................................................................................................... 27
r_signal ........................................................................................................ 27
5.8. Gestionnaire de smaphores ......................................................................... 28
s_cree, s_creeEx, s_openEx ....................................................................... 28
s_close......................................................................................................... 28
s_wait........................................................................................................... 28
s_signal........................................................................................................ 29
5.9. Requtes diverses.......................................................................................... 29
fct_disable.................................................................................................... 29
fct_enable .................................................................................................... 29
5.10. Accs aux ports E/S sous Windows NT....................................................... 30
OpenPort...................................................................................................... 30
InPortb, InPortw, InPortdw ........................................................................... 30
OutPortb, OutPortw, OutPortdw................................................................... 30
ClosePort ..................................................................................................... 30
6. EXEMPLES FOURNIS................................................................................... 31
Page -IV-
Page -1-
1. INTRODUCTION
1.1. Prsentation de Mtr86 Win32
Mtr86Win32 est compos de DLL Mtr86WX.dll et de librairies dimportation Mtr86WX.lib avec X = M
(Visual C++) et B (Borland).
Pour les cibles utilisant Windows NT, il est galement ncessaire d'installer des pilotes en mode noyau.
Mtr86Win32 permet dcrire des programmes multitches temps rels aussi bien en mode console quen
mode graphique de faon indpendante du compilateur utilis pour le dveloppement. Larchitecture dun
programme en mode console utilisant Mtr86Win32 est la mme que celle de Mtr86 pour MsDos. Par
rapport cette dernire version, Mtr86Win32 prsente lavantage de grer de faon transparente les
problmes de rentrances des Bibliothques C et C++, facilitant ainsi llaboration de code fiable.
Installation sur poste individuel partir des disquettes (ou CD) dinstallation
Insrer la disquette ou le CD dans le lecteur et lancer install. Pour la version licence site, fournir la cl
daccs. Attention : la simple copie des rpertoires ne permet pas de faire fonctionner une application
Mtr86Win32 du fait de linstallation de pilotes en mode noyau. Prciser lors de linstallation loutil de
dveloppement (Visual C++ ou Borland C++), le noyau tant diffrent pour chacun de ces compilateurs.
Rpertoires installs
Rpertoire des exemples non objets
Rpertoire des exemples objets
Noyaux, pilotes E/S, fichiers denttes, librairies non objets
Noyaux objets, fichiers denttes
Introduction
Page -2-
Introduction
Page -3-
1. Modifier la ligne 1 pour que le nom du port soit conforme au nom du fichier portx.sys copi dans
WinNt\System32\Drivers,
2. Modifier IoPortAddress et IoPortCount en fonction de vos besoins puis enregistrer le fichier sous le
nom de portX.ini avec X = 1 | 2 ... | 5.
3. Inscrire le pilote dans la base de registre. Pour ce faire ouvrir une fentre console, changer de
rpertoire pour se placer dans le rpertoire dinstallation de Mtr86Win32 Noyau\PortDrv puis inscrire
le pilote dans le registre laide de la commande Regini.exe :
regini portX.ini. Windows NT chargera automatiquement ce pilote au prochain redmarrage .
Il est possible de modifier ladresse de base et la plage E/S dun port une fois le pilote install en ditant
la cl HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Port1\Parameters dans la
base de registre. Cette adresse est prise en compte de faon dynamique condition de relancer
lapplication utilisant le pilote. Attention il faut avoir les droits administrateur.
Si un pilote de port ne dmarre pas linitialisation du systme (voir le journal dvnement laide de
lobservateur dvnements) cest quil y est en conflit dadresse avec un priphrique utilisant dj cette
Introduction
Page -4-
E/S ou avec un pilote de port E/S dj install. Il nest pas possible dattaquer un mme port E/S
simultanment laide de deux pilotes diffrents : le pilote de port est conu de telle sorte quil nautorise
pas le recouvrement dadresses.
Recommandations pour lutilisation des ports E/S sous Windows NT.
Laccs des adresses systme des ports E/S peut mettre en pril le systme dexploitation. Pour cette
raison laccs au port seffectue laide dune adresse relative par rapport ladresse de base. Tout
accs en dehors de la plage prvue est intercepte et provoque une violation daccs ne mettant pas en
danger le systme dexploitation. Pour fiabiliser vos programmes nous vous recommandons de limiter
strictement la plage E./S des ports.
Utilisation des ports E/S sous Windows 9X.
Ce systme dexploitation autorisant laccs aux ports E/S, on utilise les fonctions habituelles daccs aux
ports fournis par la librairie de votre compilateur (inp, outp pour VC, inportb, outportb pour Borland).
Introduction
Page -5-
La classe temps rel possde une priorit suprieure au systme dexploitation. Cette classe ne doit tre
utilise que pour des tches trs courtes trs forte contrainte de temps. Un processus de classe temps
rel comportant une tche effectuant de lattente active bloque tout le systme exploitation (y compris la
souris et le clavier).
Pour permettre dapprhender ces mcanismes de priorits Mtr86Win32 est fourni avec un exemple priorit
permettant de modifier de faon dynamique la priorit du processus et des tches. Une case cocher (suspendre)
permet de simuler une attente active.
Lutilisation de ce programme ne prsente pas de risque de blocage dans le cas o on choisit deffectuer de lattente
active avec un processus de classe temps rel : une tche priorit maximale annule automatiquement lattente
active au bout de 5 secondes (indicateur tches arrtes). Ltude de ce programme permet de bien situer lutilisation
de Mtr86 dans un environnement Windows GUI.
Introduction
Page -6-
/ On : Off la boucle
compteur comporte une
Utilisation du programme
TP1
Appuyer sur Pause ( les compteurs ne sincrmentent plus ), puis sur RAZ
TP4
Cochez / dcocher la case T1. Observation : le processus cre sexcute / sarrte.
Fermer une application.
Assurer vous que lapplication restante est en mode pause ( les compteurs de sincrmentent pas).
Modifier la priorit processus en classe temps rel.
Dcocher la case T1, modifier la priorit de la tche correspondante priorit maximale , modifier la priorit de
Introduction
Page -7-
d_tic(3); // rsolution 3 ms
...
dort(1); // tempo de 3 ms
...
dort(3); // tempo de 3 ms
...
dort(5); // tempo de 6 ms
d_tic(1); // rsolution 1 ms
...
dort(1); // tempo de 1 ms
...
dort(3); // tempo de 3 ms
...
dort(5); // tempo de 5 ms
Les rsolutions infrieures 10 ms surchargent le processeur sur les configurations peu puissantes.
La primitive d_tic semble poser problme pour le processeur Pentium IV
Les transitions notes sur le diagramme correspondent des primitives Mtr86. Ce diagramme est celui
d'une application comportant plusieurs tches au mme niveau de priorit. Dans une application
comportant une tche par priorit, l'tat virtuel EXEC n'existe pas.
Introduction
Page -8-
*/
*/
/* Tche d'initialisation
*/
TACHE init( void )
{
/* crer les tches */
/* crer les smaphores, ressources, tubes ... s'il y a lieu */
/* lancer les tches*/
}
/* Autres tches */
main()
{
int code;
_init_video();
/* Si utilisation sous VC++ de la librairie conio */
code = start(init, 4096);
/* lancement de l'application,
*/
/* avec 4Ko octets de pile pour init()
*/
.........
/* section effectue la fin du programme.*/
exit(code);
/* retour au systme
*/
}
IMPORTANT
Le programme doit tre reli aux librairies dimportation suivantes :
1. Mtr86WX.lib spcifique au compilateur utilis. Cette librairie est situe dans le rpertoire :
pour Borland (BC5X et Builder)
<rpertoire dinstallation>\Noyau\Borland
pour Microsoft VC++4
<rpertoire dinstallation>\Noyau\VisualC\Vc6
pour Microsoft VC++6
<rpertoire dinstallation>\Noyau\VisualC\Vc4
2. Pour les programme effectuant les E/S conio avec un compilateur VisualC++, une librairie conio
compatible avec la librairie Borland est fourni : crt.lib, Le programme dinstallation copie cette
librairie dans :
<rpertoire dinstallation>\Noyau .
3. Aux librairies runtime C ou C++ multithread dynamique (DLL) (voir configuration des
compilateurs).
Mtr86Win32 est fourni avec des exemples de programmes en mode console et en mode GUI. Selon le
compilateur utilis, charger les exemples partir des fichiers de projet situs dans Exemples\Borland,
Exemples\Builder, Exemples\VisualC\Vc4, Exemples\VisualC\Vc6.
Introduction
Page -9-
Dynamique
GUI ou Console
Multithread
Se relier Mtr86WB.lib
spcifique au compilateur
VisualC++ V4X..V6X
Choisir une librairie
multithread parmi
les suivantes.
(obligatoirement des
DLL)
Introduction
Page -10-
C++ Builder
Introduction
Page -11-
Page -12-
Gestionnaire de ressources
r_cree
: crer une variable ressource.
r_close
: supprimer une variable ressource.
r_wait
: rserver une ressource.
r_signal
: signaler la libration d'une ressource.
Gestionnaire de smaphores
s_cree
: crer un smaphore.
s_creeEx (#)
: crer un smaphore utilisable entre plusieurs processus.
s_openEx (#)
: ouvre un smaphore dj cre.
s_close
: supprimer un smaphore.
s_wait
: P(s).
s_signal
: V(s).
Accs aux ports E/S Windows NT
OpenPort (#)
: Ouvrir un port E/S
InPortb (#)
: Lire un octet sur le port spcifi
InPortw (#)
: Lire un mot de 16 bits sur le port spcifi
InPortdw (#)
: Lire un mot de 32 bits sur le port spcifi
OutPortb (#)
: Ecrire un octet sur le port spcifi
OutPortw (#)
: Ecrire un mot de 16 bits sur le port spcifi
OutPortdw (#)
: Ecrire un mot de 32 bits sur le port spcifi
ClosePort (#)
: Fermer un port E/S
Page -13-
5. PRIMITIVES DE MTR86
5.1. Formalisme utilis
Nom de la requte
ACTION
SYNTAXE
Prototype 'C'
PARAMETRES
VAL. RETOURNE
ERREUR FATALE
DESCRIPTION
Description de la requte.
VOIR AUSSI
Fonctions apparentes.
EXEMPLE 'C'
start, startEx
ACTION
SYNTAXE
PARAMETRES
VAL. RETOURNE
ERREUR FATALE
DESCRIPTION
VOIR AUSSI
mtr86exit, mtr86fatal.
EXEMPLE C
#include "mtr86w32.h"
TACHE t( void )
{
...
}
TACHE init()
{
int i;
for (i=0; i < 20; i++)
active(cree( t, PRIORITE_NORMALE, 10000));
}
int main()
{
exit(start( init, 8192 ));/* active le noyau
*/
}
Page -14-
mtr86exit
ACTION
SYNTAXE
void
PARAMETRES
DESCRIPTION
mtr86exit est une des trois faons de terminer une application (avec mtr86fatal ou par
appui sur les touches ^BREAK ou ^C (si ses touches sont valides). Les objets utiliss
par mtr86 sont librs. Le retour s'effectue par la primitive start avec pour valeur, le
paramtre pass mtr86exit. Les valeurs comprises entre 90..99 sont rserves par
mtr86. mtr86exit peut tre utilis sans restriction dans tous les types de tches.
VOIR AUSSI
start, mtr86fatal.
EXEMPLE 'C'
mtr86exit( unsigned n );
Code d'erreur.
cree
ACTION
Cr une tche.
SYNTAXE
HANDLE
PARAMETRES
VAL. RETOURNE
ERREUR FATALE
M Priorit errone.
DESCRIPTION
VOIR AUSSI
EXEMPLE 'C'
Handle de la tche cre. Ce handle est compatible avec les objets Win32 et
peut tre utilis avec toutes les fonctions Win32.
active
ACTION
SYNTAXE
void
PARAMETRES
ERREUR FATALE
DESCRIPTION
Activer un tche consiste faire passer celle-ci de l'tat cre l'tat prt. Cette
procdure place une tche dans la file d'attente des tches ligibles au niveau de priorit
de la tche. Si la tche active est plus prioritaire que la tche ayant effectue la requte,
la tche active est immdiatement lance. Une activation ne correspond pas
obligatoirement au lancement de la tche. La tche active n'est effectivement lance
lorsque sa priorit est suprieure ou gale celle de toutes les tches prtes ou en
excution. Une tche cre peut recevoir un signal d'activation tout moment. Lorsque
la tche n'est pas en mesure d'accepter le signal d'activation, celui-ci est mmoris
jusqu' concurrence de 232.
VOIR AUSSI
EXEMPLE 'C'
handle de la tche.
Page -15-
tache_priorite
ACTION
SYNTAXE
PARAMETRES
DESCRIPTION
VOIR AUSSI
classe_priorite.
EXEMPLE 'C'
priorite.c
Handle de la tche.
Priorit de la tche (voir cree).
classe_priorite
ACTION
SYNTAXE
PARAMETRES
DESCRIPTION
VOIR AUSSI
start
EXEMPLE 'C'
priorite.c
priorite_processus
ACTION
SYNTAXE
VAL. RETOURNE
DESCRIPTION
VOIR AUSSI
classe_priorite.
EXEMPLE 'C'
priorite.c
d_tic
ACTION
SYNTAXE
DWORD
VAL. RENVOYEE
DESCRIPTION
d_tic permet de modifier la rsolution de l'horloge utilise dans toutes les oprations
caractre temporel ( dort, ...).
Le paramtre tic doit tre : 1ms tic 10ms. Sous windows NT/2000, la prcision des
temporisations atteint 1ms avec un tic de 1ms. La temporisation est arrondie sur des
multiples de la rsolution. Exemple : pour d_tic(3)
dort(1); // tempo de 3 ms
dort(3); // tempo de 3 ms
dort(5); // tempo de 6 ms
EXEMPLE 'C'
d_tic.c
cvrtic
ACTION
Sans action
SYNTAXE
unsigned
PARAMETRES
VAL. RENVOYEE
Valeur fournie.
DESCRIPTION
Cette primitive nest prsente que pour des raisons des comptabilits avec Mtr86 Dos.
Avec Mtr86 Win32 tous les temps sont exprims en ms.
cvrtic( unsigned ms );
Page -16-
dort
ACTION
SYNTAXE
PARAMETRES
VAL. RENVOYEE
DESCRIPTION
VOIR AUSSI
EXEMPLE C
suspend
ACTION
SYNTAXE
PARAMETRES
VAL. RENVOYEE
DESCRIPTION
Suspend fait passer une tche de l'tat d'excution l'tat suspendu. Les signaux de
suspension sont mmoriss. Il faut viter d'utiliser cette requte avec une tche
susceptible de se bloquer l'aide d'un mcanisme faisant intervenir plusieurs tches
(smaphores, moniteurs, ressources, tubes) cause du risque potentiel d'interbloquage
que prsente cette requte. Une tche suspendue peut tre relance avec la primitive
active.
VOIR AUSSI
EXEMPLE 'C'
reveille
ACTION
SYNTAXE
PARAMETRES
void
reveille( HANDLE htache );
DESCRIPTION
reveille est une primitive de bas niveau qui permet de relancer toute tche suspendue. Si
la tche rveille est de priorit suprieure la tche courante, cette dernire est
suspendue la fin du quantum jusqu' ce qu'elle redevienne son tour prioritaire. Seul le
premier signal de rveil est mmoris, les signaux suivant sont perdus.
VOIR AUSSI
EXEMPLE 'C'
dort.
voir exemples Mtr86 Dos
Page -17-
detruit
ACTION
supprime
ACTION
SYNTAXE
PARAMETRES
DESCRIPTION
Cette primitive arrte l'excution de la tche dsigne. La tche dtruire peut tre dans
un tat CREE, SUSP, EXEC, PRET. A la fin de cette requte la tche dtruite passe
l'tat non cre et le handle ne peut plus tre utilis. La suppression d'une tche doit
toujours tre envisag avec circonspection : si la tche est dtruite alors qu'elle utilise un
objet en exclusion mutuelle, cet objet n'est pas libr et la programme complet peut se
bloquer.
EXEMPLE 'C'
voir exemple E8
Handle de la tche.
tache_c
ACTION
SYNTAXE
VAL. RENVOYEE
EXEMPLE 'C'
tache_id
ACTION
SYNTAXE
PARAMETRES
Handle de la tche.
VAL. RENVOYEE
DESCRIPTION
tache_id permet de dterminer le numro de la tche dans laquelle est utilis cette
requte. Cette primitive est gnralement utilise pour quune tche sidentifie lorsqu'il
existe plusieurs instances d'une mme tche (voir exemple e17). La tche lance par start
possde le n 1.
EXEMPLE 'C'
thread_id
ACTION
SYNTAXE
PARAMETRES
id de la tche.
VAL. RENVOYEE
DESCRIPTION
thread_id permet de dterminer le handle dune tche laide de son entier lidentifiant.
La tche lance par start possde la valeur id = 1.
EXEMPLE 'C'
pas dexemples
num_tache
ACTION
SYNTAXE
unsigned
PARAMETRES
Nom de la tche.
VAL. RENVOYEE
Handle de la tche
Page -18-
DESCRIPTION
num_tache permet de retrouver le handle d'une tche lorsqu'il n'a pas t mmoris lors
de la cration de la tche. La recherche du numro d'une tche est bas sur la
comparaison de l'adresse de la tche avec les valeurs mmorises dans les structures de
donnes de mtr86. Par consquent num_tache ne peut tre utilis lorsque plusieurs
instances d'une mme tche sont cres. num_tache est un processus itratif
consommateur de temps CPU et ne doit pas tre la mthode gnrale d'obtention du
numro d'une tche.
NOTA : num_tache ne peut tre utilis lorsqu'il existe plusieurs instances d'une mme
tche car num_tache utilise l'adresse de celle-ci pour dterminer son numro.
VOIR AUSSI
cree, tache_c.
EXEMPLE 'C'
m_wait, MONITOR
ACTION
SYNTAXE
void
#define
DESCRIPTION
Les moniteurs sont utiliss pour assurer l'exclusion mutuelle lors de l'accs aux sections
critiques. Un seul processus utilisant la primitive moniteur peut tre actif un instant
donn. m_wait est la procdure d'exclusion mutuelle la plus rapide. m_wait est
galement implant sous la forme de la macro MONITOR dans la version C (voir
mtr86W32.h) Cette macro doit tre utilise avec ENDM dans le mme bloc. La macro
MONITOR effectue un contrle minimal de la smantique de la primitive. Lors de la
destruction de tches utilisant un moniteur, il est indispensable que la tche fournissant
le signal de destruction effectue la squence m_waitdetruitm_signal. Aprs
destruction des tches, m_signal autorise l'limination du numro de la tche dtruite de
la file des tches moniteurs.
VOIR AUSSI
EXEMPLE 'C'
E32, E4
m_wait( void );
MONITOR m_wait(); {
m_signal, ENDM
ACTION
SYNTAXE
void
#define
DESCRIPTION
VOIR AUSSI
EXEMPLES
Voir m_wait.
m_signal( void );
ENDM m_signal(); }
verrouille
ACTION
SYNTAXE
void
PARAMETRES
DESCRIPTION
VOIR AUSSI
EXEMPLES
Pas dexemples
verrouille( unsigned n ) ;
deverrouille
Liste des requtes par catgorie
Page -19-
ACTION
SYNTAXE
void
PARAMETRES
DESCRIPTION
VOIR AUSSI
EXEMPLES
Pas dexemples
deverrouille( unsigned n ) ;
m_send
ACTION
SYNTAXE
void
PARAMETRES
ERREUR FATALE
DESCRIPTION
m_send active une tche en lui passant le message point par le deuxime paramtre. Le
message est recopi dans une file de messages limite. Le comportement de cette requte
est identique active(). Le message pass doit tre un pointeur vers la donne
transmettre.
La taille totale du message doit tre infrieure ou gale 8 octets. Le type du message
est dtermin par la tche active. m_send recopie l'objet dans la pile de la tche juste
avant de lancer celle-ci. En consquence la donne doit exister jusqu'au moment de sa
transmission effective la tche autorise le passage de tous les types de donnes.
Transmission de variables: c'est l'adresse de la variable qui doit tre fournie.
Transmission de l'adresse d'un tableau: dclarer un pointeur sur le tableau, et
passer l'adresse du pointeur m_send.
Transmission d'une constante: il n'est pas possible de transmettre directement une
constante (comme pour l'adresse d'un tableau), celle-ci n'ayant pas d'adresse disponible
en Pascal ou en C. La solution consiste alors l'affecter une variable, puis de
transmettre l'adresse de celle-ci. Pour une chane de caractres, lorsque celle-ci est
infrieure 8 caractres, l'adresse de la chane peut tre directement transmise, la tche
reoit la chane complte en paramtre. Pour une chane de taille suprieure il faut
affecter l'adresse de la chane un pointeur et passer l'adresse de ce pointeur m_send.
La tche reoit alors l'adresse de la chane.
VOIR AUSSI
active.
EXEMPLE C
Voir exemple E5
t_cree
ACTION
SYNTAXE
HANDLE
PARAMETRES
Adresse de la tche
Taille de la pile (minimum 4Ko),
Intervalle d'excution en ms
VAL. RENVOYEE
Handle de la tche.
DESCRIPTION
Page -20-
p_plein et p_vide). Une tche rythme est lance par la primitive t_start et arrte par
t_stop toujours la fin de celle-ci.
VOIR AUSSI
t_start, t_stop.
EXEMPLE
E7
t_start
ACTION
SYNTAXE
void
PARAMETRES
DESCRIPTION
t_start lance une tche cre par t_cree. Une fois lance la tche est automatiquement
relance avec l'intervalle de temps dfini par t_cree.
VOIR AUSSI
t_cree, t_stop.
Handle de la tche.
t_stop
ACTION
SYNTAXE
void
PARAMETRES
DESCRIPTION
t_stop arrte l'excution d'une tche rythme, mais ne dtruit pas la tche. Une tche
rythme ne doit pas tre dtruite..
e_cree
ACTION
SYNTAXE
VAL. RENVOYEE
DESCRIPTION
VOIR AUSSI
EXEMPLE C
EVENEMENT numero_event_1;
TACHE f1( void )
{
...
numero_event_1 = e_cree();
}
Exemple E4
e_close
ACTION
SYNTAXE
void
e_close( EVENEMENT ev );
PROCEDURE e_close( evn : EVENEMENT );
PARAMETRES
DESCRIPTION
Dans une application taille critique, la requte e_close permet de rcuprer la mmoire
alloue lorsque le groupe n'est plus utilis. Les groupes vnements sont
automatiquement clos lors de l'arrt de l'application.
Numro du groupe.
VOIR AUSSI
Page -21-
e_wait
ACTION
SYNTAXE
PARAMETRES
VAL. RENVOYEE
DESCRIPTION
L'opration e_wait permet une tche d'attendre une combinaison particulire de bits.
Contrairement Mtr86Dos, les vnements sont mmoriss. Lorsqu'une tche se
met en attente d'un vnement, elle ne se bloque pas lorsque lvnement est dj
signal. Il n'est pas possible d'attendre simultanment une combinaison EAND et EOR.
La solution consiste utiliser un bit vnement combinant cette opration.
Exemple: vnement attendu : bit3 OU (bit2 ET bit1).
Combiner bit2 ET bit1 = bitx dans la requte m_signal et attendre bit3 OU bitx.
A partir de la version 2.11 il est possible de connatre la combinaison de bits
ayant satisfait la requte en testant la valeur retourne par e_wait (ne prsente un
intrt dans le cas EOR).
ERREUR FATALE
VOIR AUSSI
EXEMPLE C
EVENEMENT e;
TACHE f1( void ) {
if ( e_wait( e, 0x0300,0x0F00,EAND,cvrtic(1000) )
puts("Evnement reus");
else puts("Dpassement du temps d'attente pour e");
}
L'exemple suivant indfiniment la figuration des bits suivant:
xxxx xx11 xxxx xxxx b
xxxx xx01 xxxx xxxx b,
xxxx xx10 xxxx xxxx b
TACHE f1( void ) {
e_wait( e, 0x0300, 0x0300, EOR, 0);
...
}
e_signal
ACTION
SYNTAXE
unsigned
PARAMETRES
VAL. RENVOYEE
DESCRIPTION
Page -22-
Numro du groupe,
Valeur du groupe
ERREUR FATALE
VOIR AUSSI
rv_cree
ACTION
Cr et initialise un rendez-vous.
SYNTAXE
RV
PARAMETRES
VAL. RENVOYEE
DESCRIPTION
ERREUR FATALE
VOIR AUSSI
rv_close, rv_signal.
EXEMPLE C
RV rv;
rv_close
ACTION
SYNTAXE
void
rv_close( RV n );
Liste des requtes par catgorie
Page -23-
PARAMETRES
DESCRIPTION
VOIR AUSSI
rv_cree, rv_signal.
rv_signal
ACTION
SYNTAXE
unsigned
PARAMETRES
VAL. RENVOYEE
OK si rendez-vous,
TIM en cas de dpassement du temps autoris.
DESCRIPTION
rv_signal suspend la tche effectuant cet appel sauf si elle est la dernire tche se
rendre au rendez-vous. Le gestionnaire de rendez-vous relance alors toutes les autres
tche et rinitialise la variable rendez-vous. Si le rendez-vous n'a pas lieu dans les dlais
prvus, les tches sont relances avec une indication de timeout.
VOIR AUSSI
rv_close, rv_cree.
rv_signal( RV num );
rv_init
ACTION
Rinitialise un rendez-vous.
SYNTAXE
void
PARAMETRES
VAL. RENVOYEE
OK si rendez-vous,
TIM en cas de dpassement du temps autoris.
DESCRIPTION
VOIR AUSSI
rv_close, rv_cree.
p_open
ACTION
SYNTAXE
TUBE
PARAMETRES
DESCRIPTION
VAL. RENVOYEE
ERREUR FATALE
VOIR AUSSI
EXEMPLE C
Handle du produteur
Handle du consommateur
Timeout sur l'accs au tube en ms:
0
= dure d'une transaction indtermine
n
= dure d'une transaction limite tics timeout
Page -24-
p_close
ACTION
Dtruit un tube.
SYNTAXE
void
PARAMETRES
DESCRIPTION
Libre les structures de donnes utilises par le tube spcifi. En dsallouant un tube,
p_close peut tre utilis pour vider un tube (squences p_closep_open). p_close ne
relance pas les tches bloques sur un tube vide ou plein.
VOIR AUSSI
EXEMPLE
p_close( t1 );
Numro du tube.
p_write
ACTION
SYNTAXE
unsigned
PARAMETRES
Numro du tube.
Pointeur vers la zone source.
Nombre d'octets crire.
VAL. RENVOYEE
DESCRIPTION
p_write crit dans le tube de numro spcifi. Lorsque le tube est plein, le rdacteur est
suspendu jusqu' ce qu'une donne soit extraite du tube. Si aucune donne n'est extraite
du tube avant tics timeout, la tche est relance avec une indication de temps dpass.
Les tubes utilisent des tampons de 4Ko octets, mais rien interdit d'crire des donnes de
taille quelconque.
ERREUR FATALE
VOIR AUSSI
EXEMPLE C
p_read
ACTION
SYNTAXE
unsigned
PARAMETRES
Numro du tube.
Pointeur vers la zone destination.
Nombre d'octets lire.
VAL. RENVOYEE
DESCRIPTION
p_read lit le tube de numro spcifi. Lorsque le tube est vide, le lecteur est suspendu
jusqu' ce qu'une donne soit crite du tube. Si aucune donne n'est crite dans le tube
avant tics timeout, la tche est relance avec une indication de temps dpass.
ERREUR FATALE
VOIR AUSSI
EXEMPLE C
j;
Page -25-
...
if (( p_read ( t1, tableau, sizeof(tableau))==TIM)
puts("Donnes non lues dans le temps imparti");
}
p_plein
ACTION
SYNTAXE
unsigned
PARAMETRES
Numro du tube.
VAL. RENVOYEE
DESCRIPTION
Cette requte ne se justifie que pour les tches ne devant pas se bloquer (tche
matrielle). En permettant le test de la place disponible dans un tube, cette requte vite
au gestionnaire de tubes de suspendre la tche sur un tube plein.
VOIR AUSSI
p_vide
ACTION
SYNTAXE
unsigned
PARAMETRES
Numro du tube.
VAL. RENVOYEE
DESCRIPTION
Cette requte ne se justifie que pour les tches ne devant pas se bloquer (tche
matrielle). En permettant le test de la quantit de donnes disponibles dans un tube,
cette requte vite au gestionnaire de tubes de suspendre la tche sur un tube vide.
VOIR AUSSI
p_openEx
ACTION
SYNTAXE
PARAMETRES
DESCRIPTION
VAL. RENVOYEE
ERREUR FATALE
VOIR AUSSI
EXEMPLE C
tubeIPC.cpp
p_closeEx
ACTION
Dtruit un tube.
SYNTAXE
PARAMETRES
DESCRIPTION
Libre les structures de donnes utilises par le tube spcifi. En dsallouant un tube,
p_close peut tre utilis pour vider un tube (squences p_closep_open). p_close ne
relance pas les tches bloques sur un tube vide ou plein.
VOIR AUSSI
Numro du tube.
Page -26-
p_writeEx
ACTION
SYNTAXE
PARAMETRES
Numro du tube.
Pointeur vers la zone source.
Nombre d'octets crire.
VAL. RENVOYEE
DESCRIPTION
p_write crit dans le tube de numro spcifi. Lorsque le tube est plein, le rdacteur est
suspendu jusqu' ce qu'une donne soit extraite du tube. Si aucune donne n'est extraite
du tube avant tics timeout, la tche est relance avec une indication de temps dpass.
Les tubes utilisent des tampons de 4Ko octets, mais rien interdit d'crire des donnes de
taille quelconque.
ERREUR FATALE
VOIR AUSSI
p_readEx
ACTION
SYNTAXE
PARAMETRES
Numro du tube.
Pointeur vers la zone destination.
Nombre d'octets lire.
VAL. RENVOYEE
DESCRIPTION
p_read lit le tube de numro spcifi. Lorsque le tube est vide, le lecteur est suspendu
jusqu' ce qu'une donne soit crite du tube. Si aucune donne n'est crite dans le tube
avant tics timeout, la tche est relance avec une indication de temps dpass.
ERREUR FATALE
VOIR AUSSI
p_pleinEx
ACTION
SYNTAXE
DWORD
PARAMETRES
Numro du tube.
VAL. RENVOYEE
DESCRIPTION
Cette requte ne se justifie que pour les tches ne devant pas se bloquer (tche
matrielle). En permettant le test de la place disponible dans un tube, cette requte vite
au gestionnaire de tubes de suspendre la tche sur un tube plein.
p_videEx
ACTION
SYNTAXE
DWORD
PARAMETRES
Numro du tube.
VAL. RENVOYEE
DESCRIPTION
Cette requte ne se justifie que pour les tches ne devant pas se bloquer (tche
matrielle). En permettant le test de la quantit de donnes disponibles dans un tube,
cette requte vite au gestionnaire de tubes de suspendre la tche sur un tube vide.
Liste des requtes par catgorie
Page -27-
r_cree
ACTION
Cr une ressource.
SYNTAXE
VAL. RENVOYEE
DESCRIPTION
ERREUR FATALE
VOIR AUSSI
EXEMPLE C
E8
r_close
ACTION
SYNTAXE
void
PARAMETRES
DESCRIPTION
Libre les structures de donnes utilises par le gestionnaire de ressources. Cette requte
est effectue automatiquement la fin d'une application.
ERREUR FATALE
VOIR AUSSI
r_close( RESSOURCE nr );
Numro de la ressource.
r_wait
ACTION
SYNTAXE
void
PARAMETRES
DESCRIPTION
r_wait rserve une ressource. Si la ressource est occupe, la tche ayant effectue la
requte est place dans une file d'attente jusqu' la libration de celle-ci. Si la ressource
est attribue la tche, elle devient la proprit exclusive de la tche et elle seule peut la
librer par r_signal. Une tche matrielle ne doit pas effectuer cette requte.
ERREUR FATALE
VOIR AUSSI
Numro de la ressource.
r_signal
ACTION
SYNTAXE
void
PARAMETRES
r_signal( RESSOURCE nr );
Numro de la ressource.
Liste des requtes par catgorie
Page -28-
DESCRIPTION
ERREUR FATALE
VOIR AUSSI
SYNTAXE
HANDLE
HANDLE
HANDLE
PARAMETRES
VAL. RENVOYEE
DESCRIPTION
VOIR AUSSI
s_close
ACTION
Dtruit un smaphore.
SYNTAXE
void
PARAMETRES
DESCRIPTION
VOIR AUSSI
EXEMPLE
s_close ( sem )
Numro du smaphore.
s_wait
ACTION
SYNTAXE
unsigned
PARAMETRES
Numro du smaphore
Timeout=0 attente de dure indtermine.
Timeout<> 0 attente borne de tic timeout.
VAL. RENVOYEE
Page -29-
DESCRIPTION
s_wait effectue l'opration P(s) sur le smaphore s. Si le smaphore est < 0, la tche
ayant effectue la requte est place dans la file d'attente du smaphore considr. Dans
le cas ou la tche se bloque, timeout permet de spcifier la dure maximale d'attente
en nombre de quantum.
Algorithme de principe de la primitive s_wait(sem):
P(sem):
sem := sem - 1
si sem < 0 alors
bloquer la tche courante
et la placer dans la file d'attente du smaphore
is
ERREUR FATALE
VOIR AUSSI
EXEMPLE
s_signal
ACTION
SYNTAXE
void
void
PARAMETRES
DESCRIPTION
s_wait effectue l'opration V(s) sur le smaphore s. Si le smaphore est gal 0 la tche
en tte de la file d'attente est attribue au processeur.
Algorithme de principe de la primitive s_signal(sem):
V(sem) :
sem := sem + 1
si sem <= 0 alors
sortir une tche de la file d'attente du smaphore
activer cette tche
is
ERREUR FATALE
VOIR AUSSI
EXEMPLE
Handle du smaphore.
Valeur ajouter au smaphore.
fct_disable
ACTION
SYNTAXE
PARAMETRES
DESCRIPTION
fct_disable est utilise pour interdire les fonctionnalits dsignes par fonc.
VOIR AUSSI
EXEMPLE
fct_disable(CTRL_BREAK_EVENT);
fct_enable.
fct_enable
ACTION
SYNTAXE
void
PARAMETRES
DESCRIPTION
Utilise pour autoriser les fonctionnalits dsignes par la valeur du paramtre fonc.
VOIR AUSSI
fct_disable.
EXEMPLE
fct_enable(CTRL_BREAK_EVENT);
5.10.
Page -30-
OpenPort
ACTION
SYNTAXE
PARAMETRES
DESCRIPTION
VAL. RETOURNEE
EXEMPLE
hPort1 = OpenPort("\\\\.\\port1");
SYNTAXE
BYTE
InPortb ( HANDLE hPort, DWORD dwOffset );
WORD
InPortw ( HANDLE hPort, DWORD dwOffset );
DWORD InPortdw ( HANDLE hPort, DWORD dwOffset) ;
PARAMETRES
VAL. RETOURNEE
SYNTAXE
PARAMETRES
ClosePort
ACTION
SYNTAXE
PARAMETRES
Page -31-
6. EXEMPLES FOURNIS
Les exemples illustrant l'utilisation des requtes sont fournis dans le rpertoire exemples et traitent les
thmes suivant :
e0 :
e32 :
e4 :
e5 :
e6 :
e7 :
e8 :
e11 :
e14 :
lment de solution du dner des philosophes (utilisation des smaphores pour la synchronisation
et l'exclusion mutuelle).
e17 :
priorite :
exemple Mtr86Win32 de type GUI mettant en vidence les mcanismes dordonnancement des
tches en entre tches et entre processus.
tubeIPC :
exemple en code C++ de type GUI mettant en uvre lchange de donnes entre deux processus
l'aide de tubes.
d_tic :
t_com :
6. MTR86 OBJET
6.1. Prsentation de Mtr86 Win32 noyau objet
Mtr86 Win32 noyau objet encapsule les primitives de Mtr86Win32 et possde des caractristiques
similaires Mtr86Win32. Mtr86 Win32 objet est fourni sous forme de librairie dynamique et de pilote de
priphrique en mode noyau (NT). Les librairies dynamiques : Mtr86WOM.dll ( Visual C6 ) et Mtr86WOI.dll
(Borland 5.X, Inprise Builder C++) sont copis dans le rpertoire systme de windows.
Diffrences avec Mtr86Win32
Bien que conu de faon trs diffrente de Mtr86Win32, Mtr86Objt reste trs semblable son homologue
mais prsente dans l'ensemble plus d'efficacit en particulier grce l'utilisation de la STL dans le gestion
des listes. Les diffrences essentielles concernent les primitives suivantes :
Primitive
send
Version Objet
Envoie un message (256 octets) vers une
tche sans activer celle-ci. La rception du
message se fait par receive.
fc_xxx
Non implment.
Utiliser SetConsoleCtrlHandler de l'api Win32
num_tache Non implment.
tache_id
Retourne un identificateur unique de tche
thread_id
Non implment.
Description
Tache
Classe virtuelle pure servant de classe de base toutes les tches. Toutes les taches doivent
hriter de cette classe et doivent surcharger la fonction virtuelle pure void main(void*)
TacheRythmee Classe virtuelle pure servant de classe de base toutes les tches rythmes.
Toutes les tches rythmes doivent hriter de cette classe et doivent surcharger la fonction
virtuelle pure : void main(DWORD* dwIntervalle)
Monitor
Classe permettant de crer des objets dexclusion mutuelle l'intrieur d'un mme processus.
Mutex
Classe permettant de crer des objets dexclusion mutuelle l'intrieur d'un mme processus et
entre processus diffrents.
Semaphore
Classe permettant de crer des objets smaphores lintrieur dun mme processus.
RendezVous
Classe permettant de crer des objets de synchronisation lintrieur dun mme processus et
entre processus diffrents.
Evenement
Classe permettant de crer des objets de synchronisation lintrieur dun mme processus.
Pipe
Classe permettant de crer des objets utilisant le modle producteur consommateur lintrieur
dun mme processus.
PipeEx
Classe permettant de crer des objets utilisant le modle producteur consommateur tendus aux
processus.
Port
Classe permettant de crer des objets accdant aux ports E/S (Windows NT).
Ecriture des applications
Constantes
Priorit des tches
Description
priorite_normale
priorite_minimale
Priorit minimale.
priorite_maximale
Priorit maximale.
Priorit processus
Description
classe_priorite_temps_reel
classe_priorite_haute
classe_priorite_normale
classe_priorite_basse
Description
Tache
TacheRythmee
Monitor
Mutex
Crer un objet Mutex valide. Si celui-ci ne doit uniquement tre instanci sans tre
cre, driver une classe appelant le constructeur Mutex(NO_CREATE)(voir exemple
PipeInterProcess).
Semaphore
RendezVous
Evenement
Pipe
PipeEx
Port
Classe Tache
Types dfinis
Description
Valeurs
RUNNING
WAIT_RESULT
Description
Tache()
Constructeur par dfaut. Cre une tche de priorit normale avec une tous
taille de pile par dfaut. La tche nest pas active.
Tache(int priorite)
Tache(int priorite,
RUNNING running)
Tache(int priorite,
RUNNING running,
void* param)
e17, e32,
philo
Tache(int priorite,
RUNNING running,
void* param,
unsigned pile)
tous
void cree()
e19
void active()
DWORD suspend()
HANDLE handle()
DWORD tache_id()
void reveille()
int priorite()
Exemples
e11, e17,
e19
BOOL fixe_priorite(
int priorite )
priorite
e19, e19_0
e19, e19_0
Rceptionne un message dune tche. Attention, la tche doit avoir
t instancie. Prvoir un tampon de 256 octets ( taille du message).
Membres statiques
Exemples
void active(Tache& t)
Active la tache t.
tous
DWORD suspend(Tache& t)
PipeInterP..,
priorite
void reveille(Tache& t)
void supprime(Tache& t)
e19
BOOL fixe_priorite(Tache& t,
int priorite )
priorite
void send(Tache& t,
const void* buff)
e19
HANDLE tache_c()
Membres statiques
Exemples
d_tic
int wait_for_terminate()
tous
tous
BOOL priorite_processus(
CLASSE_PRIORITE priorite)
priorite
DWORD
priorite
void MONITOR()
philo, e32
void ENDM()
philo, e32
Description
Exemples
tous
priorite_processus()
Classe TacheRythmee
Types dfinis
Description
Valeurs
RUNNING
Description
TacheRythmee( )
TacheRythmee( DWORD ms )
Cre une tche rythme (priorit maximale) avec une taille de pile
par dfaut. La tche nest pas active.
e7
TacheRythmee(DWORD ms,
RUNNING running)
Cre une tche rythme (priorit maximale ) avec une taille de pile
par dfaut avec possibilit d'activation immdiate (running==RUN )
ou diffre (running==WAIT ).
e7
Cre une tche rythme (priorit maximale) avec une taille de pile
par dfaut avec possibilit d'activation immdiate (running==RUN)
ou diffre (running==WAIT) et de spcification de taille de pile
(minimum 4K).
e7
void cree()
void supprime(Tache& t)
void active()
void t_start()
e7
void t_stop()
e7
Membres statiques
Description
Exemples
void active(Tache& t)
Active la tache t.
e7
void supprime(Tache& t)
BOOL fixe_rythme(
TacheRytmee& t,
DWORD dwMs )
void t_start(TacheRytmee& t)
e7
void t_stop(TacheRytmee& t)
e7
Description
Exemples
e7
Exemples
e7
Classe Monitor
Membres
Description
Exemples
Monitor()
philo
void lock()
philo
void unlock()
philo
Classe Mutex
Types dfinis
Description
Valeurs
MODE
Membres
Description
Exemples
Mutex()
e32
e32
void lock()
unlock()
HANDLE handle()
e32
e32
Classe Semaphore
Types dfinis
Description
Valeurs
MODE
Membres
Description
Exemples
Semaphore()
e32, philo
e32, philo
Semaphore(DWORD
Semaphore(DWORD
DWORD
Semaphore(DWORD
DWORD
char*
valeur_init)
valeur_init,
valeur_max )
valeur_init,
valeur_max,
szNom)
Cre un objet smaphore, en prcise sa valeur initiale & maximale. e32, philo
Cre un objet smaphore de porte interprocessus, en prcise sa
valeur maximale et le nomme.
valeur_init,
valeur_max,
szNom,
mode)
valeur_init)
e32, philo
e32
DWORD wait()
P(s). Retourne OK
e32, philo
DWORD P()
P(s). Retourne OK
e32, philo
e32, philo
e32, philo
BOOL
signal()
e32, philo
BOOL
V()
e32, philo
BOOL
signal(long nCount)
BOOL
V(long nCount)
long
val()
HANDLE handle()
Classe RendezVous
Membres
Description
Exemples
RendezVous( )
e11
RendezVous( DWORD n )
e11
RendezVous( DWORD n,
DWORD dly_max )
e11
e11
e11
e11
Classe Evenement
Types dfinis
Description
Valeurs
CODES
code de retour
MODE
code opration
Membres
Description
Exemples
Evenement()
e4
e4
e4
e4
Membres
Description
Exemples
Pipe( )
e6
e6
e6
e6
e6
e6
e6
DWORD plein( )
e6
DWORD vide( )
e6
valeur,
mask,
op,
timeout )
Classe Pipe
Classe PipeEx
Membres
Description
Exemples
PipeEx( )
tubeIPC.cpp
tubeIPC.cpp
tubeIPC.cpp
tubeIPC.cpp
tubeIPC.cpp
tubeIPC.cpp
tubeIPC.cpp
DWORD plein( )
tubeIPC.cpp
DWORD vide( )
tubeIPC.cpp
Description
Port()
BYTE InPortb( DWORD Offset ) Lit un octet ladresse E/S relative offset
USHORT InPortw(DWORD Offset) Lit un mot de 16 bits ladresse E/S relative offset
DWORD InPortdw(DWORD Offset) Lit un mot de 32 bits ladresse E/S relative offset
void OutPortb(DWORD Offset,
DWORD dwData)
Exemples
Mtr86 Win32 noyau objet -41Ajouter au projet le fichier dimportation Mtr86WOX.lib correspondant au compilateur utilis. Pour les
applications Visual C++ (uniquement) utilisant les E/S console de type conio Borland ajouter la librairie
statique crt.lib. Ces fichiers sont situs dans les rpertoires :
NoyauObj\Borland
( Mtr86WOI.lib ) // BC5.X
NoyauObj\Builder
( Mtr86WOI.lib ) // Builder 4.X..5.X
NoyauObj\VC6
( Mtr86WOM.lib et Crt.lib ) // Visual C++ 6.X
Fichiers inclure au minimum
#include
"<chemin>\conio.h"
// pour les applications ne mode console (VISUAL C++)
#include
"<chemin>\mtrobj.h"
// pour les dfinitions des classes
Pragma pour applications Visual C++ en mode console
#pragma comment(linker, "/nodefaultlib:LIBCMT")
Le constructeur Producteur appelle le constructeur de la classe Tache avec tous les paramtres par dfaut :
Tache( int priorite = priorite_normale,
RUNNING running = WAIT,
void*
pParam = NULL,
unsigned Taille_Pile = 0 );
//
//
//
//
priorit normale
tche non active
pas de paramtre pass
taille de pile par dfaut
Une classe dfinie suivant ce mode peut tre utilis pour instancier un objet global ou statique (constructeur appel
avant la fonction main du programme C++). Ici lappel du constructeur Producteur ne provoquera pas (et ne doit
jamais provoquer) le dmarrage de la tche avant lexcution de la fonction main. Le paramtre running du
constructeur de la classe Tache prenant ici la valeur WAIT.
// Tache producteur
int main()
{
//...
Tache::fixe_priorite(p1, priorite_normale+2);
// ou
p1.fixe_priorite(priorite_normale+2);
Tache::active(p1);
// ou
p1.active();
//...
// lance la tche
// idem
Les requtes des classes Tache et TacheRythmee existent sous deux formes :
une forme statique : exemple active(p1);
une forme utilisant un objet tche : exemple p1.active();
La deuxime forme prsente un risque dutilisation errone lorsquelle est employe dans une tche. Exemple :
Ecriture des applications
La forme statique ne prsente pas cet inconvnient : il faut absolument prciser la tche sur laquelle porte la requte.
Pour viter une maladresse de ce type, il suffit dutiliser le fichier _mtrobj.h la place mtrobj.h.
Dans ce fichier, les fonctions non statiques dangereuses sont prfixes par le caractre soulign.
// rsolution 1 ms d_tic(3);
...
// tempo de 1 ms
dort(1);
...
// tempo de 3 ms
dort(3);
...
// tempo de 5 ms
dort(5);
// rsolution 3 ms d_tic(10);//
...
// tempo de 3 ms
dort(1); //
...
// tempo de 3 ms
dort(3); //
...
// tempo de 6 ms
dort(5); //
rsolution 10ms
tempo de 10 ms
tempo de 10 ms
tempo de 10 ms
Les rsolutions infrieures 10 ms surchargent le processeur sur les configurations peut puissantes.
Ecriture des applications
// e19_0.cpp (extraits)
class Producteur : public Tache {
public :
Producteur() {};
virtual void main(void*);
};
Producteur
Consommateur consommateur;
producteur;
Dans ce premier exemple le producteur accde lobjet global consommateur (1) et le consommateur
lobjet global producteur (2) et (3). Cet accs noffre aucune difficult puisque producteur et
consommateur sont globaux. Cette technique de programmation nest en gnral pas souhaitable.
Une autre approche consiste encapsuler lapplication dans une classe comportant les tches de services.
Considrons le cas suivant ( e19.cpp) :
class Application {
public :
Application();
...
private :
Producteur
producteur;
Consommateur consommateur;
...
};
La classe Application peut utiliser librement les mthodes publiques de lobjet producteur et de lobjet
consommateur, mais le contraire nest possible que via un objet application global. Dautre part si les objets
producteur et consommateur sont privs ces classes doivent tre dclares amies de la classe Application
(voir code ci-dessous) :
class Producteur : public Tache {
public :
Producteur() {};
virtual void main(void*);
};
Lobjet dans le quel sont encapsuls les tches nest pas forcment global, laccs aux fonctions des objets agrgs
reste possible via un pointeur statique.
class Producteur : public Tache {
public :
Producteur() {};
virtual void main(void*);
};
class Consommateur : public Tache {
public :
Consommateur() {};
virtual void main(void*);
};
class Application {
public :
Application() { TheApp = this; }
void run() {
Tache::active(producteur);
Tache::active(consommateur);
Tache::wait_for_terminate();
}
static Application* GetApp() { return TheApp; }
private :
Producteur
producteur;
Consommateur consommateur;
static Application* This;
// static pour tre accessible une fonction static
friend class Producteur;
friend class Consommateur;
};
Application* Application::TheApp;
// Allocation du pointeur statique
void Producteur::main(void * )
{
...
send(Application::GetApp()->consommateur, Message);
...
}
28
28
28
04
08
RendezVous
Evenement
Pipe
PipeEx
Port
56
32
64
44
04
Mtr86 Win32 noyau objet -46E7 : mise en uvre des tches rythmes. Application objet.
E19 : Mise en uvre du modle producteur consommateur : passation de messages. Application objet.
Mtr86 Win32 noyau objet -47E32 : programmation du modle lecteur - rdacteur. Application objet.
PipeInterProcess : Application GUI objet. Mise en uvre du modle producteur consommateur en utilisant
un tube de communication interprocessus.
Mtr86 Win32 noyau objet -48priorits : Application GUI objet. Mise en uvre des priorits des tches et processus.