Synchronisation de variable mise à jour par un listener

Fermé
saad0n87 - 26 juil. 2013 à 12:31
 saad0n87 - 29 juil. 2013 à 10:12
Bonjour,

J'ai un problème de synchronisation de variable que je vais essayer d'expliquer au mieux :
Je veux effectuer le code CODE A une fois que la variable _completed sera à TRUE. La solution que j'ai imaginée est celle-ci:

try {
                   long tBefore=System.currentTimeMillis();
		   while(!_completed && (System.currentTimeMillis() - tBefore) < 10000 )
                   {
			Thread.sleep(100);
               	    }
		    }
		    catch (InterruptedException e) {
					e.printStackTrace();	}
				// CODE A 


Mon problème est que la variable _completed ( déclarée static ) est mise à jour ( dans une autre classe ) via un listener. En gros une fois que je reçois un événement en particulier :
if ( monevenement ) { _completed= true;}

ça ne marche pas. L'événement n'est intercepté qu'à la fin du timeout alors que je suis sur qu'il est envoyé bien avant.

J'espère que mon explication est assez claire et vous remercie d'avance pour votre aide.

A voir également:

2 réponses

arthurg95 Messages postés 2421 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 341
26 juil. 2013 à 12:47
Bonjour,

Déjà ce genre de boucle est à éviter dans un code (exécution d'instructions inutiles, donc gaspillage de ressources), c'est sûr tu te dis que ça ne bouffe rien, on a des Intel Core aujourd'hui. Mais ton projet n'est pas très gros, le jour où tu fais un projet de plus grand ampleur, et que tu as 500 boucles en attente dans ce style, ce n'est pas très bon.
Enfin bref, détail d'optimisation.

Si l'action est déclanché par un Listener, pourquoi ne pas déclanché une méthode via ce listener pour lancer ton action, plutôt que d'attendre que l'action soit réalisée ? Ou tu veux absolument faire l'action au bout de 10 sec même si le listener ne réagit pas ?
0
Bonjour arthurg95,

Tout d'abord merci pour ta remarque. J'ai essayé de déclencher l'action ( référée comme le CODE A ) à partir du listener mais le problème est que le code qui fait le while est toujours exécuté avant l'arrivée de l'événement que j'attends . Je m'excuse j'aurais du mentionner ce point avant.
Je me demandais s'il y'avait une solution simple qui m'éviterait de modifier l'ordonnancement des appels qui serait très coûteux.
0
arthurg95 Messages postés 2421 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 341 > saad0n87
26 juil. 2013 à 15:29
"le problème est que le code qui fait le while est toujours exécuté avant l'arrivée de l'événement que j'attends ."

Je n'ai pas très bien saisi, ce que tu veux dire par là...
0
saad0n87 > saad0n87
26 juil. 2013 à 15:52
L'architecture applicative actuelle impose que le code :
try {
long tBefore=System.currentTimeMillis();
while(!_completed && (System.currentTimeMillis() - tBefore) < 10000 )
{
Thread.sleep(100);
}
}
catch (InterruptedException e) {
e.printStackTrace(); }
// CODE A
soit exécuté avant la réception de l'event que j'attends. Disons que c'est un cheminement imposé qui fait que le CODE A ne peut être appelé directement à partir du listener.

Je suis désolé si c'est pas clair mais je suis encore relativement nouveau sur Java.
En tout cas merci pour ton aide
0
arthurg95 Messages postés 2421 Date d'inscription dimanche 24 février 2008 Statut Membre Dernière intervention 4 juin 2014 341 > saad0n87
26 juil. 2013 à 18:11
Ton _completed c'est quand l'event est effectué c'est ça ?
0
C'est ça
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
26 juil. 2013 à 20:18
Avec les thread tu peux faire ça simplement :

Thread maj= new Thread()
{
    @Override
    public void run()
    {
         // code qui met à jour _completed
    }
}

maj.start(); // début de la mise à jour

// code qui peux se faire en parallèle de la mise à jour

maj.join(); // attente de la fin de la mise à jour

// code qui d'exécutera une fois la mise à jour terminée
0
Merci pour ta réponse. Je vais tester ça dès que possible et je reviens vers toi
0