jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 2005
-
12 avril 2003 à 13:24
ofeelfree
Messages postés9Date d'inscriptionmercredi 24 septembre 2003StatutMembreDernière intervention14 juin 2005
-
19 févr. 2004 à 11:45
Ma question est simple...
Soit une variable 'strContenu1' de type String, contenant une très grosse chaine de caractère (un fichier texte de quelques Mo)...
J'ai une autre String 'strContenu2' et je voudrais que strContenu2 pointe sur la zone mémoire de strContenu1 pour ne pas recopier ma grosse chaine en mémoire...
Parce que l'instruction :
strContenu2 = strContenu1
recopie la chaine dans un autre emplacement de la mémoire vive (affectation)...
J'arrive à récupérer l'adresse mémoire de strContenu1 avec l'instruction suivante :
Dim pointeur as Long
pointeur = StrPtr(strContenu1)
Maintenant, il faut que je fasse "pointer" strContenu2 sur cette zone mémoire...
Il doit y avoir une API...
Mais laquelle... je cherche désespérement depuis hier...
Cela permettrait d'optimiser la performance des programmes VB... optimiser la consommation en mémoire vive...
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 12 avril 2003 à 15:11
CopyMemory permet de copier un contenu mémoire vers un autre emplacement de la mémoire.
C'est l'API qui doit être utilisé pour la définition de l'opérateur d'affectation '=' du langage VB.
C'est justement ce que je veux pas faire...
Je veux que mes 2 variables pointes sur le même emplacement mémoire...
Qu'elles se le partagent si tu préfères...
Je veux donc être capable de faire pointer plusieurs variables VB sur un même emplacement mémoire...
Or l'API CopyMémory ne permet pas de faire cela...
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 12 avril 2003 à 16:57
Exactement...
Mais comment faire pointer une variable VB sur une Zone mémoire déjà alloué...
Il y a 2 choses à préciser :
- l'adresse mémoire du début de la données
- sa longueur (offset)
Et éventuellement son type de données pour l'interprétation du contenu...
Si ma données fais 3 Méga octets, je ne veu xpas qu'elle soit ptésente à 2 endroits différents de la mémoire...
Mais je veux que cette données soit accessible depuis 2 variables VB...
Les pointeurs en C, C++ et dans tous les langages évolués et fortement typé servent entre autre à cela...
Avec VB, on ne peux pas accéder de la sorte à la mémoire, aussi facilement qu'en C... Mais je suis sûr qu'avec les API, on doit pouvoir faire des choses performantes...
Donc mon problème revient à faire pointer plusieurs variables VB sur une zone mémoire (identitifié par son adresse de début et sa longueur en octet).
Rien de bien compliqué dans le concept,mais alors pour le mettre en pratique en VB, c'est vraiment la galère.
Tu comprends mieux ce que je veux faire exactement ou ne suis-je toujours pas assez précis dans ma demande ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 12 avril 2003 à 18:30
Je connais la différence entre ByVal et ByRef au niveau des passages de paramètres dans une fonction VB...
Et ça ne répond pas à mon problème, car tu n'a pas déclaré une 2ème variable strContenu2. C'est le paramètre...
Et comme il est passé par référence ByRef(on dit aussi par adresse), on accède bien au même contenu mémoire...
JE suis Ok avec cela, mais par contre, comme je le dis, ça ne répond pas à mon problème, car tu n'as pas déclaré une véritable 2ème variable différente...
Je voudrais un truc du genre :
**********************
Dim strContenu1 As String
Dim pointeur As Long
Dim strContenu2 As String
strContenu1 = "123fdjhjjjkn,gdfsnlkjhkdshlk"
'Récupère l'adresse du bloc mémoire de strContenu1
pointeur = StrPtr(strContenu1)
stevebelgium
Messages postés180Date d'inscriptionlundi 17 mars 2003StatutMembreDernière intervention 7 juin 20031 12 avril 2003 à 18:59
Here is your answer !
just copy paste into a project
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" _
(ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" _
(ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
Private Declare Sub CopyMemoryWrite Lib "kernel32" Alias _
"RtlMoveMemory" (ByVal Destination As Long, Source As Any, ByVal Length As Long)
Private Declare Sub CopyMemoryRead Lib "kernel32" Alias _
"RtlMoveMemory" (Destination As Any, ByVal Source As Long, ByVal Length As Long)
Private Sub Form_Load()
Dim ptr As Long 'int * ptr;
Dim hHeap As Long
hHeap = GetProcessHeap()
ptr = HeapAlloc(hHeap, 0, 2) 'an integer in Visual Basic is 2 bytes
If ptr <> 0 Then
'memory was allocated
'do stuff
Dim i As Integer
i = 12
CopyMemoryWrite ptr, i, 2 ' an intger is two bytes
Dim j As Integer
CopyMemoryRead j, ptr, 2
MsgBox "The adress of ptr is " & CStr(ptr) & _
vbCrLf & "and the value is " & CStr(j)
HeapFree GetProcessHeap(), 0, ptr
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 13 avril 2003 à 14:41
Désolé d'être exigent... mais c'est toujours pas cela...
Tes propositions sont très bonnes et c'est vraiment sympa d'essayer de trouver la solution, mais ça ne marche toujours pas...
CopyMemoryRead va lire la valeur qui se trouve à une certaine adresse mémoire et la copie dasn une variable de destinataion ( j dans l'exemple de code).
la variable i et j ne pointe donc pas sur la même zone mémoire...
pour tester, il te suffit de faire à la fin de ton code :
i = 20
Msgbox Cstr(i)+" "+cstr(j)
Et là, tu remarques que j ne vaut pas 20... il ne pointe donc pas sur la même zone mémoire que la variable i (car sinon, il vaudrait aussi 20).
Bien essayé en tous cas... mais il faut laisser tomber l'API CopyMemory, car je ne veux surtout pas copier une zone mémoire, je veux simplement partagé une seule et unique zone mémoire pour plusieurs variables . (on dit qu'elles pointent sur cette emplacement mémoire).
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 5 juin 2003 à 16:20
Hélas non...
Et pourtant, j'ai beaucoup cherché...
Il faut se résoudre à l'évidence, le VB ne permet pas de gérer une même zone mémoire avec plusieurs varaibles. (pointeurs contenant l'adresse mémoire de cette zone).
Si tu veux optimiser la gestion mémoire, il faut changer de langage...
Moi, je vais faire migrer mon appli en Delphi...
Excellent RAD (style VB) et langage très puissant (Pascal Objet).
cs_snook
Messages postés13Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention24 juillet 2003 5 juin 2003 à 16:37
oui, c'est vraiment dommage que VB ne gère pas
cela.
Pour y remedier partiellement, j'implémente souvent
certaine routine dans des DLL en C, mais j'ai tout de
meme des limitations:
Par exemple, imagine un processus assez long, il est interessant d'afficher une barre de progression.
Le processus peut tres bien etre dans la DLL en C mais
comment modifier la valeur de la progessbar... je ne sais pas s'il est possible de passer en argument un controle VB
dans une fonction d'une DLL en C.
En fait à ce stade, tu as certainement trouver la reponse: changer de langage...
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 5 juin 2003 à 16:58
Il faut simplement que tu appelles ta procédure ou ta fonction C depuis l'évenement d'un Controle TIMER.
Ainsi, toutes les 300 ms par exemple, tu récupères la valeur que te retourne ta routine C et tu met à jour ta progressBar avec cette valeur...
Il y a certainement d'autre méthode possible...
En tous cas, en ce qui concerne les pointeurs et donc la gestion mémoire, je crois qu'on est d'accord sur le fait que VB n'est pas un bon langage la dessus...
Il est d'ailleur réputé pour sa lenteur d'exécution en mémoire et la lourdeur du code machine généré par le compilateur.
Par contre, il a évidemment des avantages non négligeable et je ne dis pas que VB est un langage pourri ou pour les débutant... loin de là, car on peut aller très loin en utilisant les API Windows...
Et c'est vrai que mélanger des routines "critiques" écrite en C (dans des dll ou éventuellement dans un ActiveX) avec du code VB semble être une très bonne alternative aux faiblesses de VB...
cs_snook
Messages postés13Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention24 juillet 2003 5 juin 2003 à 17:33
je ne connais pas du tout Delphi, uniquement le C et VB.
Chaqu'un a ces atouts et faiblesses, j'imagine que pour
Delphi c'est la meme chose?!
Et que dire de VB.net, le passage de VB6 a .net n'est
pas évident et vue les limitations de VB, je me demande
si ce n'est pas plus interessent de migrer les appli en C/C++,
au moins mis a part les appels d'API, le code est multiplateforme.