avoir une application qui traite les données en temps réel et est censée émettre un bip lorsqu'un certain événement se produit. L'événement déclencheur peut se produire plusieurs fois par seconde, et si le bip est déjà en cours de lecture lorsqu'un autre événement se déclenche, le code est simplement censé l'ignorer (au lieu d'interrompre le bip actuel et d'en commencer un nouveau). Voici le code de base:dois-je fermer un clip audio?
Clip clickClip
public void prepareProcess() {
super.prepareProcess();
clickClip = null;
try {
clipFile = new File("C:/WINDOWS/Media/CHIMES.wav");
ais = AudioSystem.getAudioInputStream(clipFile);
clickClip = AudioSystem.getClip();
clickClip.open(ais);
fileIsLoaded = true;
} catch (Exception ex) {
clickClip = null;
fileIsLoaded = false;
}
}
public void playSound() {
if (fileIsLoaded) {
if ((clickClip==null) || (!clickClip.isRunning())) {
try {
clickClip.setFramePosition(0);
clickClip.start();
} catch (Exception ex) {
System.out.println("Cannot play click noise");
ex.printStackTrace();
}
}
}
La méthode prepareProcess s'exécuter une fois le début et la méthode de playSound est appelé à chaque fois qu'un événement déclencheur se produit. Ma question est: dois-je fermer l'objet clickClip? Je sais que je pourrais ajouter une actionListener pour surveiller un événement Stop, mais comme l'événement se produit si souvent, je crains que le traitement supplémentaire ne ralentisse la collecte de données en temps réel.
Le code semble fonctionner correctement, mais mon inquiétude concerne les fuites de mémoire. Le code ci-dessus est basé sur un exemple que j'ai trouvé lors de la recherche sur le net, mais l'exemple utilisait un actionListener pour fermer le clip spécifiquement "pour éliminer les fuites de mémoire qui se produiraient lorsque la méthode stop n'était pas implémentée". Mon programme est destiné à fonctionner pendant des heures afin que toute fuite de mémoire que j'ai aura des problèmes.
Je vais être honnête: je ne sais pas comment vérifier si j'ai un problème ou non. J'utilise Netbeans, et l'exécution du profileur de mémoire m'a juste donné une énorme liste de choses que je ne sais pas lire. C'est supposé être la partie simple du programme, et je passe des heures dessus. Toute aide serait grandement appréciée!
Michael
Merci beaucoup pour la réponse. Je suis d'accord avec vous pour dire que, selon le code que je donne, cela ne semble pas poser de problème. Mais (comme vous le mentionnez) je ne sais pas non plus ce qui se passe dans les coulisses de l'objet Clip.Fooling autour de plus avec le profileur de mémoire Netbeans, il semble qu'un nouvel objet est attribué chaque fois que le son est joué. Cependant, la colonne Live Object n'augmente jamais, donc je suppose que cela signifie que la garbage collection s'en occupe immédiatement. Comportement étrange, mais je ferai en sorte de le regarder pendant les tests pour m'assurer que tout va bien. Merci encore. Michael – Michael