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
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
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 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
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"); } }
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
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()); } } }
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"); } }
Partager