probleme de constructeur

probleme de constructeur - Java - Programmation

Marsh Posté le 23-08-2005 à 15:42:58    

Voila, j'ai un probleme avec un constructeur.
 
Quand je construit un objet, il me detecte tout les port présent sur la machine. Mais si j'ai besoin de reconstruire ce même objet (sans changer son nom), il me detecte les port present sur la machine en plus de ceux qu'il avait détecté lors de la premiere fois, ce qui fais que j'ai des port en double.
 
Voici le code du constructeur (API javax.comm)

Code :
  1. public GestionComm(){
  2. Win32Driver w32Driver = new Win32Driver();
  3. w32Driver.initialize();
  4. }


 
Je pense qu'il faudrait que je puisse détruire le premier objet gestionComm que j'ai créé, mais je ne sais pas comment faire.


Message édité par blaise_laporte le 23-08-2005 à 16:06:17
Reply

Marsh Posté le 23-08-2005 à 15:42:58   

Reply

Marsh Posté le 23-08-2005 à 16:02:06    

Tu reconstruis bien ton objet avec new ?

Reply

Marsh Posté le 23-08-2005 à 16:09:56    

oui oui.
 

Code :
  1. private GestionComm maComm;
  2. ...
  3. public void methode1(){
  4. maComm = new GestionComm();
  5. ...}


 
Le probleme se pose donc si je fais appelle plusieur fois à méthode 1. Il faudrait que je puisse "détruire" maComm avant de le reconstruire.
 
 
 

Reply

Marsh Posté le 23-08-2005 à 16:10:05    

Ca viendrait pas plutot du fait que tu initialises deux fois ?
 
Essaye un constructeur sans le init....

Reply

Marsh Posté le 23-08-2005 à 16:18:56    

Ou bien utilise le pattern singleton dans ton code


---------------
Light is right
Reply

Marsh Posté le 23-08-2005 à 16:26:06    

bartleby a écrit :

Ca viendrait pas plutot du fait que tu initialises deux fois ?
 
Essaye un constructeur sans le init....


 
C'est justement l'initialisation qui me detecte le port présent. Si je le retire, je n'ai plus rien du tout. Mais en effet, c'est bien la deuxieme initialisation qui fais que j'ai des port en double.
 
Heu...
c'est quoi le pattern singleton?

Reply

Marsh Posté le 23-08-2005 à 16:40:13    

t'en fait quoi de ton Win32Driver apres? Et t'es pas supposé utiliser ça explicitement...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 23-08-2005 à 16:42:51    

.. bref, ce n'est pas un problème de constructeur, mais à priori d'utilisation de javaxcomm ou d'énoncé :p
 
... par exemple.. qu'est-ce que tu entends par "il me detecte les port present sur la machine en plus de ceux qu'il avait détecté lors de la premiere fois, ce qui fais que j'ai des port en double".
 


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 23-08-2005 à 16:46:01    

je vois pas ce que tu veux dire...

Reply

Marsh Posté le 23-08-2005 à 17:08:35    

Ca tombe bien, moi non plus [:mlc]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 23-08-2005 à 17:08:35   

Reply

Marsh Posté le 23-08-2005 à 17:22:40    

un petit programme valant mieu qu'un grand discour :
 

Code :
  1. public GestionComm(){
  2. //initialisation du driver
  3. Win32Driver w32Driver= new Win32Driver();
  4. w32Driver.initialize();
  5. //récupération de l'énumération
  6. Enumeration portList=CommPortIdentifier.getPortIdentifiers();
  7. //affichage des noms des ports
  8. CommPortIdentifier portId;
  9. while (portList.hasMoreElements()){
  10. portId=(CommPortIdentifier)portList.nextElement();
  11. System.out.println(portId.getName());
  12. }
  13. }


 
Si je fais une premeier fois appelle à ce constructeur, j'obtient:

Citation :


COM1
LPT1
LPT2


 
Si je fais appelle une deuxieme fois appelle à ce constructeur dans le même programme (pour detecter le nouveau port USB-seri que j'ai branché par exemple), j'obtient:

Citation :


COM1
LPT1
LPT2
COM1
COM4 (le port usb-serie)
LPT1
LPT2


ce qui me donne des port en double.


Message édité par blaise_laporte le 23-08-2005 à 17:23:04
Reply

Marsh Posté le 23-08-2005 à 17:23:49    

ok.
et l'appel à


 Win32Driver w32Driver= new Win32Driver();
 w32Driver.initialize();


il sert à quoi ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 23-08-2005 à 17:32:01    

d'aprés la doc de la méthode initialize:
 

Citation :

initialize() will be called by the CommPortIdentifier's static initializer. The responsibility of this method is: 1) Ensure that that the hardware is present. 2) Load any required native libraries. 3) Register the port names with the CommPortIdentifier.


 
Cette initialisation est indispensable pour pouvoir utilisé les port avec javax.comm.

Reply

Marsh Posté le 23-08-2005 à 17:38:59    

donc tu n'as pas à appeler initialize(), c'est ecrit noir sur blanc non ?
 
cela dit, je sais pas si ca va résoudre ton probleme [:joce]


Message édité par souk le 23-08-2005 à 17:39:40
Reply

Marsh Posté le 23-08-2005 à 17:40:44    

...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 23-08-2005 à 17:43:30    

Ben, si je n'appelle pas initialize, il ne me detecte pas les com...  
 
Mais je pense que nous cherchons trop compliqué.  
Simplement, comment pourrai-je faire pour détruire un objet pour en reconstruire un autre avec le même nom?

Reply

Marsh Posté le 23-08-2005 à 17:53:15    

mais qu'est-ce qu'il raconte [:ciler]
c'est TOI qui cherche trop compliqué et/ou qui ne sait pas lire la doc..


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 23-08-2005 à 17:53:29    

Heu, comme ils te l'ont dit, tu ne dois pas utiliser initialize.
 
Enleve "w32Driver.initialize();" !
 
Quand tu appels "CommPortIdentifier.getPortIdentifiers();", c'est la ou meme avant que ton truc s'initialise...


Message édité par bartleby le 23-08-2005 à 17:54:27
Reply

Marsh Posté le 23-08-2005 à 17:53:51    

j'parierais bien 100 balles sur une mauvaise installe de javaxcomm, tiens


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 23-08-2005 à 18:09:40    

Ben, si j'enleve initialize(), aucun port n'est détécté.
 
Le code est directement copier de ce tutorial : http://christophej.developpez.com/ [...] /javacomm/ et il y a bien initialize().
 
Sinon, il est possible que j'ai fais une mauvais installe de javax.comm, mais alors rien ne fonctionnerai.
 
Sinon, question general, si on fais deux fois appelle à un constructeur  
 

Code :
  1. private MonOBjet blabla;
  2. ...
  3. blabla = new MonObjet();


 
puis plus loin dans le programme:

Code :
  1. blabla = new MonObjet();


 
Cette deuxieme construction de l'objet blabla va t'elle réinitialiser toute les variables? (je pense que oui, mais j'ai un doute)
 
 

Reply

Marsh Posté le 23-08-2005 à 18:28:58    

blaise_laporte a écrit :

Sinon, il est possible que j'ai fais une mauvais installe de javax.comm, mais alors rien ne fonctionnerai.


ha [:autobot]
 
Bon et rapport à ton article...

Citation :

La dll est à mettre dans le répertoire Windows/system32, le fichier comm.jar et le fichier javax.comm.properties sont à mettre avec les autres librairies externes de votre application. Il ne faut pas toucher au fichier de configuration.


[:icon4] Faux ! le properties doit aller dans JDK_HOME/jre/lib/javax.comm.properties  
Fais ça, enleve ton appel absurde au WinDriver machin, et on revoit ça.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-08-2005 à 09:39:20    

the real moins moins a écrit :

ha [:autobot]
 
Bon et rapport à ton article...

Citation :

La dll est à mettre dans le répertoire Windows/system32, le fichier comm.jar et le fichier javax.comm.properties sont à mettre avec les autres librairies externes de votre application. Il ne faut pas toucher au fichier de configuration.


[:icon4] Faux ! le properties doit aller dans JDK_HOME/jre/lib/javax.comm.properties  
Fais ça, enleve ton appel absurde au WinDriver machin, et on revoit ça.


 
Oki!
Je l'avais mis dans J2SDK\lib et non dans J2SDK\jre\lib...
Encore un truc que j'aurais apris grace à ce forum!
 
Mais du coup, si j'enleve w32Driver.initialize();
les nouvelles comme ne sont pas detectée si je relance le constructeur.
Mais si je laisse initialize, les comme sont en double (ce qui maintenant me parait normal) mais il detecte si j'en branche une nouvelle.

Reply

Marsh Posté le 24-08-2005 à 10:29:11    

Au diable si j'y comprend quelque chose.
 
Maintenant, que je fasse ceci:
 

Code :
  1. import javax.comm.*;
  2. import com.sun.comm.Win32Driver;
  3. import java.util.*;
  4. import java.io.*;
  5. public class TestComm {
  6. public static void main (String [] args){
  7.  //initialisation du driver
  8.  Win32Driver w32Driver =  new Win32Driver();
  9.  w32Driver.initialize();
  10.  Enumeration portList = CommPortIdentifier.getPortIdentifiers();
  11.  CommPortIdentifier portId;
  12.  while (portList.hasMoreElements()){
  13.   portId = (CommPortIdentifier)portList.nextElement();
  14.   System.out.println(portId.getName());
  15.  }
  16. }
  17. }


 
ou ceci:

Code :
  1. import javax.comm.*;
  2. import com.sun.comm.Win32Driver;
  3. import java.util.*;
  4. import java.io.*;
  5. public class TestComm {
  6. public static void main (String [] args){
  7.  Enumeration portList = CommPortIdentifier.getPortIdentifiers();
  8.  CommPortIdentifier portId;
  9.  while (portList.hasMoreElements()){
  10.   portId = (CommPortIdentifier)portList.nextElement();
  11.   System.out.println(portId.getName());
  12.  }
  13. }
  14. }


 
j'obtient la même chose, ie :
 

Citation :


COM1
LPT1
LPT2
COM1
LPT1
LPT2


 
avec des comm detecté deux fois.
 
Pour le premier cas, je veux bien, étant donné que j'initialise deux fois (une fois avec initialize et une deuxieme fois avec CommPortIdentifier.getPortIdentifiers()) mais je comprend pas pourquoi avec le deuxieme code, les comm apparraissent deux fois.


Message édité par blaise_laporte le 24-08-2005 à 10:29:52
Reply

Marsh Posté le 24-08-2005 à 12:01:50    

Je viens d'essayer ton code avec rxtx sous linux, ça marche parfaitement:

/dev/ttyS1
/dev/ttyS0
/dev/lp0


 
Vire l'import du WinDriver, des fois qu'il aurait des crasses initializées en static
 
(pour info, rxtx a exactement la meme api que javaxcomm - aux noms de package près - et fonctionne sous linux, windows et ptet meme mac)


Message édité par the real moins moins le 24-08-2005 à 12:09:02

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-08-2005 à 12:14:48    

En effet, c'est moi qui me suis planté.  
 
Par contre, suite à plusieurs tests, je me suis rendu qui compte que CommPortIdentifier.getPortIdentifiers()ne semble enrengistrer les ports de la machine qu'une seul fois et qu'ensuite, il se contente de retourner lire ce qu'il a enrengistré précedement. Ce qui fais que s'il y a un nouveau port, il ne le detecte pas.


Message édité par blaise_laporte le 24-08-2005 à 12:16:01
Reply

Marsh Posté le 24-08-2005 à 12:21:42    

ouais :/


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-08-2005 à 12:32:44    

HS: t'as eu le même prof de philo que moi ?

Reply

Marsh Posté le 24-08-2005 à 13:36:05    

En faite, ce qu'il faudrai que je parvienne à faire, ce serai de lui suprimer toute les ports qu'il a détecté.
 
Je pensais donc que suprimer l'objet pourrai me le permettre; mais je ne sais pas comment faire pour suprimé manuelement un objet.

Reply

Marsh Posté le 26-08-2005 à 09:06:31    

Je dis peut-être une bêtise ( les cours de java sont un peu loin ), donc corrigez moi si je me trompe :
un appel à la méthode "finalize()" ne détruirait-elle pas l'objet en question ?

Reply

Marsh Posté le 26-08-2005 à 09:09:19    

non

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed