OVH Cloud OVH Cloud

mise a jour d'une liste de threads

73 réponses
Avatar
luc2
j'ai plusieurs threads qui tournent. chaque thread est un objet. dans
le programme principal, j'ai une liste de tous ces threads (dans un
tableau par exemple).

supposons qu'un thread se termine. comment peut-il prevenir le
programme principal, afin qu'il enleve sa reference de la liste de
threads ?

solution 1 (mauvaise) : le thread a une reference vers la liste, et il
peut la modifier. or, cela est absurde en programmation objet; le
thread (qui est un objet) n'a pas a contenir une reference vers la
liste.

solution 2 (mauvaise) : la liste est une variable globale. le thread
peut donc y avoir acces. or, une fois de plus, cela est absurde en
programmation objet; le thread n'a pas a s'occuper de mettre la liste
de threads a jour. il n'est meme pas cense savoir qu'il est repertorie
dans une liste.

existe-t-il une solution propre et non-marginale a ce probleme de
conception objet ?

10 réponses

1 2 3 4 5
Avatar
luc2
On Tue, 11 Jan 2005 15:21:57 +0100, Falk Tannhäuser
wrote:

supposons qu'un thread se termine. comment peut-il prevenir le
programme principal, afin qu'il enleve sa reference de la
liste de threads ?

solution 1 (mauvaise) : le thread a une reference vers la
liste, et il peut la modifier. or, cela est absurde en
programmation objet; le thread (qui est un objet) n'a pas a
contenir une reference vers la liste.


Pourquoi pas ? C'est justement parce que c'est un objet qu'il
peut s'inscrire et se désinscrire dans d'autres objets.


mais il ne DOIT PAS etre prevu pour s'inscrire et se desinscrire des
autres objets. un objet coherent n'a pas a savoir par qui il est
reference.


La solution à ce dilemme en POO me paraît archi-classique :
Quand on veux casser une dépendance circulaire, on introduit
une classe de base (typiquement abstraite) supplémentaire,
et on fait dépendre les deux "participants au cycle" de cette
classe, au lieu d'avoir une dépendance mutuelle directe entre
eux...

Ici, par exemple, on pourrait avoir une ABC "ThreadObserver"
avec des fonction membres virtuelles pures "Notify_started()"
et "Notify_terminated()" ;
chaque "Thread" comporte soit un pointeur sur "ThreadObserver"
(relation à cardinalité 0..1), soit un conteneur de pointeurs
(délation 0..n).
La classe "ThreadList" dérive de "ThreadObserver" et implémente
les fonctions mentionnées ci-dessus. Ainsi, un "Thread" n'a pas
à savoir qu'il appartient à une liste où il faut s'inscrire ou
désinscrire, il connaît uniquement l'interface définie par
"ThreadObserver".


cette solution est equivalente a celle des listeners en java. or, ce
n'est pas quelque chose de courant en c++.




Avatar
Falk Tannhäuser
luc2 wrote:

On Tue, 11 Jan 2005 15:21:57 +0100, Falk Tannhäuser
wrote:
La solution à ce dilemme en POO me paraît archi-classique :
Quand on veux casser une dépendance circulaire, on introduit
une classe de base (typiquement abstraite) supplémentaire,
et on fait dépendre les deux "participants au cycle" de cette
classe, au lieu d'avoir une dépendance mutuelle directe entre
eux...
[...]


cette solution est equivalente a celle des listeners en java. or, ce
n'est pas quelque chose de courant en c++.


Cette solution me semble assez courante dans le code que j'écris
ou que je suis emmené de voir... En outre, elle est présentée
dans le bouquin de GoF sur les "Design Patterns".

Falk


Avatar
Falk Tannhäuser
Christophe Lephay wrote:

"luc2" a écrit dans le message de news:


On 11 Jan 2005 14:08:47 +0100, Jean-Marc Bourguet

Ah? La conception est toujours une affaire de compromis entre
differents objectifs contradictoires, dont la simplicite et la
generalite. Si tous les objets d'une classe doivent etre reference
par un autre objet, le plus simple est de les faire s'inscrire dans
les constructeurs et desinscrire dans le destructeur.


non. si c'est le constructeur de l'objet qui inscrit l'objet dans la
liste, alors cela signifie que l'objet SAIT qu'il est dans une liste.
or, il ne doit pas le savoir.


La résolution des problèmes s'accomode souvent assez mal avec les d ogmes
religieux.


Pour moi, le but / la raison d'être de la POO est de permettre de gér er
et de minimiser les dépendances entre les modules du soft. En particuli er,
il s'agit d'éliminer les dépendances circulaires. Je suis d'accord av ec
luc2 qu'un thread n'a pas à connaître la liste à laquelle il appart ient
- l'introduction d'un "listener" (ce que semble revenir au "Observer
Pattern") constitue pour moi une solution satisfaisante et assez classiqu e
/ bien connue.

Falk



Avatar
Jean-Sebastien Mouret
luc2 writes:

des exemples semblables, on en trouve a la pelle. nier que les
listeners ne sont pas courant en c++, c'est etre de mauvaise foi.
parmi les programmes que tu as connu, quel est le pourcentage de ceux
qui utilisent des listeners ?

en java : 100%
en c++ : 0%

pour tout le monde, on a toujours environ 100% pour le java, et
environ 0% pour le c++. bref, les listeners ne sont pas courants en
c++.


il est beau ton chapeau. dans tous les programmes c++ un peu
conséquents, on retrouve le pattern observer.

http://www.dofactory.com/Patterns/PatternObserver.aspx
Frequency of use: high


--
js

Avatar
luc2
On Tue, 11 Jan 2005 15:42:48 +0100, "Christophe Lephay"
wrote:

ce que tu viens d'ecrire confirme ce que je pensais : tu es loin de la
programmation objet, et surtout, loin de l'esprit de conception.


Je pense que tu n'as pas compris le sens d'une des réponse de Jean-Marc.
La POO ne fait pas l'objet d'une idéologie sacrée sur ce groupe. Si tu
souhaites une discussion politique ou idéologique, il y en a qui sont plus
approprié que celui-ci qui a plutôt une vocation technique.


je ne suis pas en train de tenter de vous convertir a une ideologie
quelconque. c'est l'ENONCE DU PROBLEME qui demande une solution
orientee objet. rien ne vous force a me repondre si vous n'aimez pas
l'enonce du probleme, et que vous ne voulez pas le respecter.

la question que j'ai pose est une question de CONCEPTION. je peux donc
CONCEVOIR mes classes comme je le veux. si j'ai besoin que le thread
puisse accepter un listener, alors je le CONCOIS comme tel.


Non. Tu ne peux pas nécessairement les concevoir comme tu veux car il se
peut qu'elles soient amenées à collaborer avec un cadre pré-existant, que ce
soit des bibliothèques ou frameworks tierces ou une api spécifique imposée
par ton système d'exploitation.


l'enonce le dit ?

les listeners sont couramment utilises en java. c'est donc une
solution propre et non-marginale. de plus, elle respecte les
principes de la programmation objet.


Le fait d'utiliser les listeners n'a rien à voir avec le
langage. C'était courant en C++ avant même que le Java existait,
et courant en Smalltalk avant que le C++ ait vu le jour.



Celà devient dépendant du langage dès que c'est le langage qui définit l'api
avec le système d'exploitation.


au cas ou tu n'aurais pas remarque, tu viens de repondre a une
replique de james kanze.

je crois que tu confonds "etre courant" et "exister". les listeners
existent en c++, mais ils ne sont pas courants. demande a un
programmeur de c++ s'il sait ce qu'est un listener, il ne saura pas,
il n'en aura jamais utilise, tandis qu'en java, il y a cent chances
sur cent qu'il sache ce que c'est.


Parce que les listeners font partie de l'api de java et ne sont pas dans ces
cas précis un simple choix de conception de la part du programmeur.


tu viens d'expliquer POURQUOI les listeners sont plus courants en
java. or, JE ME FICHE de savoir POURQUOI les listeners sont plus
courants en java. le fait est qu'ils le sont, et qu'ils ne le sont pas
en c++.

en java, il est evident que les listeners sont courants : il y en a
partout dans l'api du java. on est donc obliges de s'en servir.


Donc on est d'accord que c'est quelque chose qui a à voir avec le langage,
contrairement à ce que tu affirmes quelques paragraphes au dessus.


j'ai affirme cela au-dessus ? ah, tu veux dire quand tu as cru me
repondre alors que tu repondais a james kanze ?

le fait est la : les listeners SONT plus frequents en java. donc, ca
ne me derange pas d'utiliser cette solution en java. les listeners NE
SONT PAS frequents en c++, donc, ca me derange d'utiliser cette
solution en c++.


Ne sont pas fréquents en C++ ? C'est dans quel verset de ta bible ?


tu le sais tres bien. on peut tres bien programmer pendant des annees
en c++ sans jamais savoir ce qu'est un listener. c'est le cas de la
majorite des programmeurs c++.

les listeners ne sont pas courants en c++.


Ça dépend du domaine d'application. Ils sont très courants où
ils conviennent.


je ne suis pas en train de me restreindre a un domaine quelconque. je
dis qu'en GENERAL (c'est-a-dire a partir d'une vision GLOBALE de tous
les domaines), les listeners ne sont pas courants en c++.


Il n'y a rien de général. tout dépend du type d'application que tu crées.


ah bon ? tu n'es pas capable de comprendre que, meme quand il y a
plusieurs applications ou plusieurs domaines differents, on peut
toujours parler EN GENERAL ? tu sais ce qu'est une GENERALISATION ?

S'il y a moins *en général* de listeners en C++ qu'en Java (ce qui reste à
démontrer), c'est que les applications cibles en ont moins besoin *en
général*.


encore une fois, tu es en train d'expliquer POURQUOI il y a moins de
listeners en c++. or, je le repete encore, ON SE FICHE de savoir
POURQUOI. le fait est que ce n'est pas courant en c++, et donc, cette
solution ne me convient pas.

maintenant que vous avez eu un exemple de ce que j'attendais
comme solution, ce sera de la rigolade pour vous d'y repondre.


Mais si tu sais ce que tu veux comme solution, pourquoi la
question ?


parce que ma solution concerne le java, pas le c++.


Et pourquoi une solution adoptée dans un langage ferait qu'elle ne peut pas
l'être dans un autre ?


parce qu'elle est courante en java, et pas en c++.

je n'ai pas demande une solution quelconque. j'ai demande une solution
propre et non-marginale. si les listeners ne sont pas courants en c++,
alors la solution des listeners est marginale en c++.


Comme il a été dit, les listeners ne sont pas "marginaux" en C++.


comme les autres, tu confonds "marginaux" et "inexistant". les
listeners ne sont pas "inexistants" en c++, mais ils sont "marginaux".

un petit exemple :

l'api du java grouille de listeners. par exemple, quand on veut faire
un bouton cliquable, c'est un listener qui est declenche quand on
clique sur le bouton.

en c++, prenons par exemple l'api de microsoft pour les boutons. on
peut constater que l'action du clic n'est pas geree par un listener.

des exemples semblables, on en trouve a la pelle. nier que les
listeners ne sont pas courant en c++, c'est etre de mauvaise foi.
parmi les programmes que tu as connu, quel est le pourcentage de ceux
qui utilisent des listeners ?

en java : 100%
en c++ : 0%

pour tout le monde, on a toujours environ 100% pour le java, et
environ 0% pour le c++. bref, les listeners ne sont pas courants en
c++.




Avatar
Matthieu Moy
Jean-Sebastien Mouret writes:

il est beau ton chapeau. dans tous les programmes c++ un peu
conséquents, on retrouve le pattern observer.

http://www.dofactory.com/Patterns/PatternObserver.aspx
Frequency of use: high


En même temps, citer un site qui parle de C#, ASP.NET, VB.NET, XML,
SOAP pour étayer une affirmation sur le C++ n'est pas très
convainquant ;-)

--
Matthieu

Avatar
Christophe Lephay
"luc2" a écrit dans le message de news:

comme les autres, tu confonds "marginaux" et "inexistant". les
listeners ne sont pas "inexistants" en c++, mais ils sont "marginaux".

un petit exemple :

l'api du java grouille de listeners. par exemple, quand on veut faire
un bouton cliquable, c'est un listener qui est declenche quand on
clique sur le bouton.

en c++, prenons par exemple l'api de microsoft pour les boutons. on
peut constater que l'action du clic n'est pas geree par un listener.

des exemples semblables, on en trouve a la pelle. nier que les
listeners ne sont pas courant en c++, c'est etre de mauvaise foi.
parmi les programmes que tu as connu, quel est le pourcentage de ceux
qui utilisent des listeners ?

en java : 100%
en c++ : 0%

pour tout le monde, on a toujours environ 100% pour le java, et
environ 0% pour le c++. bref, les listeners ne sont pas courants en
c++.


Visiblement tu as du mal à raisonner sur les cas généraux. Tous les exemples
de listeners que tu cites de Java concernent des domaines qui ne sont pas
couverts par le langage C++. La notion d'interface graphique ou de thread
n'est pas couverte par le langage C++.

Par contre, dès qu'on doit programmer en C++ la gestion d'une interface
graphique ou des threads, il n'y a pas de raison que la solution C++ diffère
d'une autre utilisée en Java pour adresser le même problème. De fait, il est
*courant* en C++ de gérer une interface graphique à l'aide de listeners.

Les listeners ne sont pas spécifiques à Java, ils sont juste un pattern OO
implémenté nativement dans Java pour des taches qui ne sont pas définies
dans le standard du C++. Le fait qu'ils soient plus fréquents en Java qu'en
C++ n'est vrai que tant que tu restreins le langage à des applications
*spécifiquement différentes*, ce qui fait que ta généralité ne vaut rien car
elle n'est vraie que dans la spécificité des taches auxquelles tu
t'attaquerais avec tel ou tel langage.

La différence entre C++ et Java, face à la même problématique, c'est que ce
pattern fait partie de l'api de Java, tandis qu'il ne fait pas partie de
l'api du C++, ce qui laisse le choix de tel design plutôt qu'un autre. Qu'un
tel choix existe n'implique aucunement que ce n'est pas un idiome C++.

On est loin du 0% que tu sors de ton chapeau.

Avatar
luc2
On Tue, 11 Jan 2005 15:51:18 +0100, "Christophe Lephay"
wrote:

Mais en pratique, un objet est rarement "cohérent" *par lui-même*.


c'est qu'il est mal concu.


Non. L'objectif dans un système objet n'est pas d'avoir des objets autonomes
mais de les faire communiquer entre eux.


je n'ai jamais dit qu'il devait etre automone, ni qu'il ne devait pas
communiquer. ca depend comment on comprend "coherent par lui-meme". si
on tient compte du contexte, "coherent par lui-meme" signifie qu'il ne
doit pas contenir une liste de lui-meme. c'est ainsi que j'ai pris
l'expression. apparemment, ce n'est pas ce que tu voulais dire. il y a
donc une bonne probabilite pour que tu sois hors-contexte.

La
finalité d'un objet, c'est assez souvent de collaborer avec d'autres
objets.
D'une manière ou d'une autre, le listener doit bien être tenu informé des
objets qu'il écoute. Soit il les créera ou les détruira de lui-même,
auquel
cas l'objet lui-même n'aura pas besoin de s'inscrire et se désinscrire,
soit
la création de l'objet se fait via une api qui echape au listener, auquel
cas ce sera à l'objet écouté de s'enregistrer/désenregistrer.


je ne vois pas ou tu veux en venir. quelle est la bonne solution ?
quelle est la mauvaise ? c'est le listener qui doit desinscrire
l'objet ? ou c'est l'objet lui-meme ?


La bonne ou mauvaise solution dépendra de contraintes spécifiques au cas par
cas. L'objectif finale est que la procédure
d'enregistrement/désenregistrement soit fiable, si possible automatique. Il
n'y a pas une façon unique d'atteindre ce but en C++. Il se peut aussi que
différentes solutions se valent ou aient chacunes leurs avantages et
inconvénients au cas par cas (pourrait-on réellement parler de choix de
design dans le cas contraire ?).


et parmi ces choix, y a-t-il une BONNE solution quelque part ?
(c'est-a-dire, une solution qui repondrait a l'enonce ?)

La cohérence, ça consiste avant tout à trouver une solution qui fournisse
la
fonctionnalité attendue en fonction des différentes contraintes de
l'environnement.


c'est une autre coherence dont tu parles la. moi, je parlais de la
coherence par rapport a la programmation objet.


Et quels sont ces critères de cohérence selon toi ?


tu devrais les connaitre.

en ce qui concerne le probleme present, tu as encore moins de criteres
a respecter, puisqu'il s'agit d'un cas particulier. le critere le plus
important etant : l'objet ne doit pas etre oblige de contenir une
liste de lui-meme.

La finalité n'est pas la
POO mais quelque chose d'autre que la POO elle-même tete d'atteindre. Le
sage montre la lune et le fou regarde le doigt, comme dirait l'autre. La POO
n'est pas une fin mais un moyen.


l'enonce l'exige. si tu ne veux pas repondre a l'enonce, rien ne t'y
oblige.



Avatar
no.bcausse.spam
luc2 wrote:

ce n'est toujours pas propre comme solution. il est naturel de vouloir
mettre la liste a jour immediatement.

et
de tout facon comment peux tu etre sur que pendant ta demande un thread
ne se termine pas. un thread c'est paralelle par definition.


cela n'est pas le centre du probleme.


alors a part le design observable qui ne te convient pas je ne vois
pas:)

--
bruno Causse
http://perso.wanadoo.fr/othello


Avatar
luc2
On Tue, 11 Jan 2005 16:06:51 +0100,
(Causse Bruno) wrote:

cette solution n'est pas propre. en effet, la liste ne sera pas
toujours a jour. elle ne le sera que periodiquement.


pourquoi?
avant de lui demandé quelque chose tu la mets a jour ("manuellement")


ce n'est toujours pas propre comme solution. il est naturel de vouloir
mettre la liste a jour immediatement.

et
de tout facon comment peux tu etre sur que pendant ta demande un thread
ne se termine pas. un thread c'est paralelle par definition.


cela n'est pas le centre du probleme.


1 2 3 4 5