OVH Cloud OVH Cloud

Evenement - Thread

2 réponses
Avatar
Christophe M.
J'ai une application qui gère des espèces de plugin.
Certains doivent pouvoir travailler indépendemment, d'autres pas
forcément; mais tous génère un événement qui permet à mon application de
réagir à un certain moment.

Exemple simple : un plugin ne fait rien, si ce n'est attendre un
événement particulier sur une autre classe. Et quand il doit réagir, il
génère lui-même l'événement qui sera intercepté par l'application
principale.

Est-il correct de faire comme ceci dans la méthode run() ? :

public class plugin extends Runnable{

public void run(){
while(! _isfinished){
// y a rien a faire donc on rends la main au processeur
Thread.yield();
}
}

// ici on réagit à l'événement généré par quelque chose
public void evenement(Event evt){
// on déclenche l'événement plugin qui sera reçut par
// l'aplication principale
triggerPluginEvent(evt);
}

}

Si mon application n'est pas graphique, peut-on générer des événements
dans des classes qui ne sont pas des threads indépendants, mais
instanciés dans le thread principal (celui de l'application )

merci de vos éclaircissements

2 réponses

Avatar
Kupee
Christophe M. wrote:

J'ai une application qui gère des espèces de plugin.
Certains doivent pouvoir travailler indépendemment, d'autres pas
forcément; mais tous génère un événement qui permet à mon application de
réagir à un certain moment.

Exemple simple : un plugin ne fait rien, si ce n'est attendre un
événement particulier sur une autre classe. Et quand il doit réagir, il
génère lui-même l'événement qui sera intercepté par l'application
principale.


Dans ton cas peut etre que les méthodes wait et notify seraient plus
adaptées, en effet, avec le yield() ton thread peut se réveiller a
n'importe quel moment ce qui n'est pas nécéssaire apparament.
En gros tu mettrais ton thread en wait, et lorsqu'on evenement arrive tu
fais un notify (le wait et le notify doivent etre dans des blocs
synchronized avec un lock sur le meme objet afin que le notify réveille
bien ton (ou tes) thread(s)

Si mon application n'est pas graphique, peut-on générer des événements
dans des classes qui ne sont pas des threads indépendants, mais
instanciés dans le thread principal (celui de l'application )


Ca, ca dépend vraiment du fonctionnement de ton application je pense

Avatar
Christophe M.
Kupee wrote:

Christophe M. wrote:

J'ai une application qui gère des espèces de plugin.
Certains doivent pouvoir travailler indépendemment, d'autres pas
forcément; mais tous génère un événement qui permet à mon application
de réagir à un certain moment.

Exemple simple : un plugin ne fait rien, si ce n'est attendre un
événement particulier sur une autre classe. Et quand il doit réagir,
il génère lui-même l'événement qui sera intercepté par l'application
principale.



Dans ton cas peut etre que les méthodes wait et notify seraient plus
adaptées, en effet, avec le yield() ton thread peut se réveiller a
n'importe quel moment ce qui n'est pas nécéssaire apparament.
En gros tu mettrais ton thread en wait, et lorsqu'on evenement arrive tu
fais un notify (le wait et le notify doivent etre dans des blocs
synchronized avec un lock sur le meme objet afin que le notify réveille
bien ton (ou tes) thread(s)

Si je comprends bien, faut faire, dans le run() :


while(_isnotfinished){
wait(monlock);
//maintenant j'ai un truc à faire
...
...
}

et dans le listener de mon thread qui est sensé gérer un événement, je
fais :

void monevenement(Event evt){
notify(monlock);
}

un truc comme ça ?
Dans ce cas, l'événement est géré dans le run du thread en fait, non ?

Si mon application n'est pas graphique, peut-on générer des événements
dans des classes qui ne sont pas des threads indépendants, mais
instanciés dans le thread principal (celui de l'application )



Ca, ca dépend vraiment du fonctionnement de ton application je pense

ma question est peut-être mal posée...

vu que finalement un événement est un méthode appelée sur un listener
par un objet qui génère l'événement. Si il n'est pas dans un thread
"séparé", quand aura-t-il la main, si ce n'est dans le cas ou le thread
principale de l'application fait appel à une de ses méthodes ?
Si "jamais", dans mon cas, ça n'arrivera pas, donc je dois pas le gérer
comme celà...

Je vais donc préciser, que faut-il faire dans el déclenchement d'un
événement ? :
// en imaginant que listenerlist est un ArrayList de listener
private void triggerMonEvent(Event evt){
for(int i = 0 ; i < listenerlist.size();i++){
((Monlistener)listenerlist.get(i)).gèreMonEvent(evt);
}
}

ou bien :
private void triggerMonEvent(Event evt){
for(int i = 0 ; i < listenerlist.size();i++){
EventQueue.invokeLater(
new Runnable(){
public void run(){
((Monlistener)listenerlist.get(i)).gèreMonEvent(evt);
}
}
}
}
}

Si c'est la solution 2, je vais galérer avec la gestion multi-thread :-)