“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 214 — #224
i
i
i
i
i
i
i
i
214
4
• La programmation concurrente dataflow
Serveur
Client 1
Client 2
?
OutS2
OutS1
InS
Figure 4.14 Les deux clients peuvent-ils parler au serveur ? Ils ne peuvent pas !
b) Une application d’affichage vidéo
Nous étudions une application simple d’affichage vidéo. Elle contient un composant
d’affichage qui reçoit un flot d’images vidéo et les affiche sur un écran. Un certain
nombre d’images par seconde arrivent au composant. Pour des raisons diverses, leur
taux peut varier : les images ont des résolutions différentes, elles ont besoin d’un
traitement numérique ou le réseau de transmission a une bande passante et une latence
variables.
À cause du taux variable d’arrivée des images, on ne peut pas toujours afficher
toutes les images. On doit parfois en laisser tomber. Par exemple, il faut parfois sauter
rapidement jusqu’à la dernière image envoyée. Cette manière de gérer le flot ne peut
pas être faite dans le modèle déclaratif concurrent, parce qu’il n’y a aucune manière
de détecter la fin courante d’un flot. On pourra le faire si on étend le modèle avec
l’opération IsDet. Avec IsDet nous pouvons définir la fonction Skip qui prend
un flot et qui renvoie sa queue non liée :
fun {Skip Xs}
if {IsDet Xs} then
case Xs of _|Xr then {Skip Xr} [] nil then nil end
else Xs end
end
Skip traverse le flot jusqu’à ce qu’elle trouve une queue non liée. Voici une version
légèrement différente qui attend toujours d’avoir au moins un élément dans le flot :
fun {Skip1 Xs}
case Xs of X|Xr then
if {IsDet Xr} then {Skip1 Xr} else Xs end
[] nil then nil end
end
i
i
i
i
i
i
i
i
214
4
• La programmation concurrente dataflow
Serveur
Client 1
Client 2
?
OutS2
OutS1
InS
Figure 4.14 Les deux clients peuvent-ils parler au serveur ? Ils ne peuvent pas !
b) Une application d’affichage vidéo
Nous étudions une application simple d’affichage vidéo. Elle contient un composant
d’affichage qui reçoit un flot d’images vidéo et les affiche sur un écran. Un certain
nombre d’images par seconde arrivent au composant. Pour des raisons diverses, leur
taux peut varier : les images ont des résolutions différentes, elles ont besoin d’un
traitement numérique ou le réseau de transmission a une bande passante et une latence
variables.
À cause du taux variable d’arrivée des images, on ne peut pas toujours afficher
toutes les images. On doit parfois en laisser tomber. Par exemple, il faut parfois sauter
rapidement jusqu’à la dernière image envoyée. Cette manière de gérer le flot ne peut
pas être faite dans le modèle déclaratif concurrent, parce qu’il n’y a aucune manière
de détecter la fin courante d’un flot. On pourra le faire si on étend le modèle avec
l’opération IsDet. Avec IsDet nous pouvons définir la fonction Skip qui prend
un flot et qui renvoie sa queue non liée :
fun {Skip Xs}
if {IsDet Xs} then
case Xs of _|Xr then {Skip Xr} [] nil then nil end
else Xs end
end
Skip traverse le flot jusqu’à ce qu’elle trouve une queue non liée. Voici une version
légèrement différente qui attend toujours d’avoir au moins un élément dans le flot :
fun {Skip1 Xs}
case Xs of X|Xr then
if {IsDet Xr} then {Skip1 Xr} else Xs end
[] nil then nil end
end
