N'ayant aucune connaissance ou presque concernant la facon avec laquelle un programme java est interprété je m'adresse à vous concernant un probleme de memoire.
Je fais une acquisition continue d'un signal et lorsque l'acquisition est lancée l'utilisation memoire de mon processus java ne fait qu'augmenter et ne revient jamais à l'etat initial meme une fois l'acquisition stoppée.
Voici mon code:
La methode run() est appelée par le timer toutes les 100ms.
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 public class AcquisitionContinueTimed extends Timer{ UI refUI; AcquisitionContinue taskAcq; public AcquisitionContinueTimed(UI refUI){ this.refUI = refUI; taskAcq = new AcquisitionContinue(); } public void run(){ refUI.data = taskAcq.ReadAcqCont(refUI.taskHandle, refUI.data, refUI.nsample); refUI.TabbedPanel.getSelectedComponent().repaint(); } }
Je pense avoir isolé le probleme, il s'agirait de la ligne:
car quand je mets cette ligne en commentaire l'utilisation memoire n'augmente plus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part refUI.data = taskAcq.ReadAcqCont(refUI.taskHandle, refUI.data, refUI.nsample);
data dans ma classe UI etant un double[]
La fonction ReadAcqCont:
Merci d'avance si vous avez une idée.
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 JNIEXPORT jdoubleArray JNICALL Java_AcquisitionContinue_ReadAcqCont (JNIEnv *env, jobject jobj, jint taskHandle, jdoubleArray datarray, jint jbuffersize){ int32 read=0; int i; float64 *datab = (*env)->GetDoubleArrayElements(env, datarray, NULL); //buffer float64 *data = (float64 *)malloc(jbuffersize*sizeof(float64)); DAQmxReadAnalogF64(taskHandle,-1,10.0,DAQmx_Val_GroupByScanNumber,data,jbuffersize,&read,NULL); // A CHANGER PEUT ETRE datab[0] = read; for(i=read+1; i<jbuffersize; i++){ datab[i-read] = datab[i]; } for(i=0; i<read; i++){ datab[i-read+jbuffersize] = data[i]; } (*env)->ReleaseDoubleArrayElements(env,datarray,datab,0); return(datarray); }
Partager