Salut,
Je dois transmettre à ma librairie de traitement du signal des tableaux de données. Auparavant j'ai créé un contrôle ActiveX, mais à l'exécution il s'avère être beaucoup trop lent à cause du type OleVariant utilisé pour les tableaux dynamiques.
Donc la solution dll me parait la meilleure en termes de performances, sauf que j'ai un pb dès les 1ers tests : les tableaux à transmettre peuvent être de taille variable et souvent assez grosse, j'ai donc prévu de passer en paramètre :
1. un pointeur sur l'adresse du tableau
2. sa taille
...plutôt que le tableau entier. Mais dans la dll je n'arrive pas à libérer le pointeur sur le tableau dynamique, j'ai une exception EInvalidPointer sur la ligne Dispose ci-dessous qd elle est activée ; sinon ça marche mais évidemment la mémoire utilisée augmente à chaque exécution de la fonction...
Code de la dll :
Code de l'application test :
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 library MaDll; (...) type PSingleDynArray = ^TSingleDynArray; function SetSignal(const SignalAdress: Pointer; SignalSize: Integer): Single; var pTab: PSingleDynArray; // pointeur sur mon tableau "local" siTemp: Single; I: Integer; begin New(pTab); SetLength(pTab^, SignalSize); try pTab:= SignalAdress; // "positionnement" à l'adresse transmise siTemp := 0; // un traitement bidon for I := 0 to High(pTab^) do siTemp := siTemp + pTab^[I]; Result := siTemp; finally //Dispose(pTab); // exception EInvalidPointer pTab:= nil; end; end; (...)
En l'ocurrence à chaque clic sur mon bouton la mém. utilisée augmente de 100000 * 4 (taille Single) = 400000 octets
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 procedure TForm1.Button1Click(Sender: TObject); var Data: TSingleDynArray; I: Integer; ptTemp: Pointer; begin SetLength(Data, 100000); // Remplissage valeurs bidon for I := 0 to High(Data) do Data[I] := I + 1; ptTemp := @Data; Label1.Caption := FloatToStr(SetSignal(ptTemp, Length(Data))); end;
Comment faire pour libérer cette mémoire svp ?
Merci !
Partager