IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

Thread et Listener


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2006
    Messages : 36
    Par défaut Thread et Listener
    Bonjour,

    J'ai une appli java embarquée qui réalise différentes choses et qui doit, parallelement, lancer un gps et réaliser un log à chaque réception de frames gps.

    Le probleme c'est que le lancement du gps bloque mon appli mais la réception des frames se fait correctement.
    J'ai une classe PrintCoord qui a une méthode start() et stop() qui lancent et arretent le gps
    J'ai fait une classe MonGPSThread qui extends de Thread.
    Dans sa méthode run(), j'instancie PrintCoord et lance sa méthode start().
    J'instancie également dans ce run() le Listener que j'ai mis dans une classe séparée.

    Le problème est je pense, que la méthode start() lance le gps qui ensuite se débrouille tout seul, donc la méthode run() de mon thread se termine et la réception des frames se fait dans le process principal ce qui bloque mon appli.

    Voici du code, ce qui sera peut être plus clair que mon baratin.

    La classe MonGPSThread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    package xxx;
     
    import xxx.PrintCoord;
     
    public class MonGPSThread extends Thread {
     
    	private PrintCoord printCoord;
    	private MaquetteMain demandeur;
    	private boolean fini = false;
    	private ListenerGPS listener;
     
     
     
    	public MonGPSThread(MaquetteMain m) {
    		setDemandeur(m);
    	}
     
    	public void run() {
    		try {
    			listener = new ListenerGPS();
    			printCoord = new PrintCoord(this);
    			printCoord.start();
    			while (!getDemandeur().isFini()){
    				Thread.sleep(5000);
    			}
    		} catch (Exception e) {
    			System.err.println("erreur dans le Thread");
    		}
    	}
     
    	public MaquetteMain getDemandeur() {
    		return demandeur;
    	}
     
    	public void setDemandeur(MaquetteMain demandeur) {
    		this.demandeur = demandeur;
    	}
     
    	public PrintCoord getPrintCoord() {
    		return printCoord;
    	}
     
    	public void setPrintCoord(PrintCoord printCoord) {
    		this.printCoord = printCoord;
    	}
     
    	public boolean isFini() {
    		return fini;
    	}
     
    	public void setFini(boolean fini) {
    		this.fini = fini;
    	}
     
    	public ListenerGPS getListener() {
    		return listener;
    	}
     
    	public void setListener(ListenerGPS listener) {
    		this.listener = listener;
    	}
    }
    La classe PrintCoord
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    package xxx;
     
    import yyy.comvs.jni.gpsdevice.Configuration;
    import yyy.comvs.jni.gpsdevice.GPSDevice;
    import xxx.Logger;
    import xxx.MonGPSThread;
     
    public class PrintCoord {
     
    	// reference on GPS device
    	private GPSDevice device;
    	private Configuration configuration;
    	private MonGPSThread thrd;
     
    	/**
             * Constructeur de la classe
             * 
             */
    	public PrintCoord(MonGPSThread t) {
    		thrd = t;
    		this.device = GPSDevice.getInstance();
    		configuration = new Configuration();
     
    		configuration.setGGAFrequency(5);
    		configuration.setGLLFrequency(0);
    		configuration.setGSAFrequency(0);
    		configuration.setGSVFrequency(0);
    		configuration.setMSSFrequency(0);
    		configuration.setRMCFrequency(0);
    		configuration.setVTGFrequency(0);
    	}
     
    	/*
    	 * method to configure the GPS and start it
    	 */
    	public void start() {
    		// start gps device
    		this.device.startGPS(configuration);
    		Logger.log(Logger.TRACE, "gps started");
    		System.out.println("gps started");
    		// register as listener
    		this.device.addGPSDeviceListener(thrd.getListener());
    	}
     
    	public void stop() {
    		// unregister listener
    		this.device.removeGPSDeviceListener(thrd.getListener());
    		// stop device
    		this.device.stopGPS();
    		Logger.log(Logger.TRACE, "gps stopped");
    		System.out.println("gps stopped");
    	}
     
    }
    La classe ListenerGPS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    package xxx;
     
    import yyy.comvs.jni.gpsdevice.GPSDeviceListener;
    import yyy.comvs.jni.gpsdevice.frame.GGAFrame;
    import yyy.comvs.jni.gpsdevice.frame.GPSFrame;
     
    public class ListenerGPS implements GPSDeviceListener{
     
    	public ListenerGPS(){
     
    	}
     
    	// method to implement GPSDeviceListener interface
    	public void onNewFrame(GPSFrame frame) {
    		System.out.println("Frame recue !!");
    		Logger.log(Logger.TRACE, "frame reçue");
    		// this method is called each time a new frame arrived.
    		// test if frame is an instance of GGA frame
    		if (frame instanceof GGAFrame) {
    			// cast frame into RMCFrame
    			GGAFrame gga = (GGAFrame) frame;
    			// display information
    			System.out.println("Heure :"+gga.getTime());
    			System.out.println(" Latitude :" + gga.getLatitude());
    			System.out.println(" Longitude :"+ gga.getLongitude());
    			Logger.log(Logger.TRACE, gga.getTime() + " " + gga.getLatitude()
    					+ " " + gga.getLongitude());
    		}
    	}
    }
    Bout de code de l'appli principale issu de la classe MaquetteMain (extends JFrame)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    	/**
             * Démarre l'enregistrement du parcours par le GPS
             * 
             */
    	public void demarreGPS() { // demarre le gps
    		try {
    			gpsThread = new MonGPSThread(this);
    			gpsThread.start();
     
    		} catch (Exception e) {
    			Logger.log(Logger.DEBUG, "ca passe pas");
    			System.out.println("ca passe pas");
    		}
    	}

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    A part un partage des responsabilités entre classes un peu brouillon, je ne vois rien de choquant.

    Es tu sur que ta vm embarquée supporte le multithreading?

    Quand tu dis que ton appli bloque, qu'est ce que tu veux dire? Les traces ne sortent plus? Tu restes bloquer sur une methode? As tu vérifier avec un debugguer?

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2006
    Messages : 36
    Par défaut
    Pour la vm, c'est une Creme. Elle semble supporter car un thread qui ne toucherait pas au GPS fonctionne correctement sans bloquer l'appli.
    Ce que j'entends par blocage c'est que l'ihm ne réagit plus.
    Le lancement du gps devrait être accompagné de la fermeture d'un Dialog et du changement du Panel affiché sur la Frame.
    Rien de tout cela ne se produit, ou plutot si, le Dialog se ferme après quelques secondes mais c'est tout.
    Je n'ai pas de débugger sur l'embarqué et je n'ai pas de GPS sur le pc fixe pour tester cette partie.
    En mode débug à l'ancienne (des println entre chaque instruction), le programme bloque sur un setVisible(true), si je le commente, il bloque sur l'instruction suivante et ainsi de suite.

    Pour le partage des responsabilités, je me rend bien compte que je ne suis pas un pro de l'architecture vu les appels souvent croisés que je suis obligé de faire ^^

Discussions similaires

  1. Thread en tant que listener
    Par deletme dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 17/08/2012, 09h01
  2. Remplacer un thread par un listener
    Par Saita dans le forum Débuter avec Java
    Réponses: 38
    Dernier message: 30/07/2010, 16h57
  3. Glassfish V2, Listener HTTP Threadé
    Par asouchu dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 10/06/2009, 11h31
  4. Probleme Thread, Listener, Random Java
    Par monicaCruZ dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 25/05/2007, 15h56
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo