fichiers. Or dans beaucoup de langages on passe par des partages de zone en RAM
afin d'aller plus vite et ne pas laisser de trace sur disque (je pense plus
à la rémanence qu'à l'oublie d'effacement...)
En Autoit c'est aussi possible grâce à la librairie "memory.au3" dont je joint une copie en bas de ce post.
deux scripts sont présentés : un partageur et un utilisateur (appelé client)
le partageur va appeler le client en lui donnant son PID et un pointeur (adresse)
vers une variable typée.
Ainsi le client pourra utiliser la variable et celle-ci sera également
utilisable en temps réelle par l'appelant
en gros
partageur déclare i=6 et lance client avec son pid et l'adresse de i
si client fait i=i+i, alors i vaut aussi 7 dans l'appelant.
Du coups nous avons un process principal (partageur) qui peut traîter le prog
prncipal et un auxilière (client) qui update des valeurs du principale dans
un thread diférent, donc on n a plus de problème de type un while 1 appelant
un autre while 1 qui bloque le premier ... certeon peut passer par de l'échange par fichier mais les temps d'accès lecture / écriture vont être bien plus lents et dangeureux
pour tester ceci, compiler le client.au3 en client.exe dans le même
rep que createur.au3 (le partageur)
Puis lancez avec scite (pour lire les consolewrite ...) createur.au3
Créateur.au3 :
Code : Tout sélectionner
; partie "partageuse" qui va appeler un exe en lui donnant son PID et un pointeur pour partager une info en RAM
$my_str=DllStructCreate("int partage") ; création d'une structure qui contiendra un int à partager
DllStructSetData($my_str,"partage",35) ; initialistaion à 35, comme ça ....
$ptr=DllStructGetPtr($my_str,"partage") ; on récupère l'adresse de la structure (pointeur)
ConsoleWrite($ptr&@CRLF) ; ça c'est du debug pour voir si on a bien un pointeur non NULL, c'est tpujours bon pour un poc
ConsoleWrite(@AutoItPID&@CRLF) ; idem pour le PID
Run("client.exe "&@AutoItPID&" "&$ptr) ; on lance le deuxième script compilé sous le nom de client.exe avec comme argument le PID de l'appelant (ce script) est le l'adresse de la variable à partager
$old=DllStructGetData($my_str,"partage") ; on récupère la valeur de l'integer donc 35 (pour l'insant)
;boucle d'attente d'évènement
While 1
Sleep(250)
$encours=DllStructGetData($my_str,"partage") ; on récupère la valeur actuelle, qui n'est pas modifié ici par ce script
If $old <> $encours Then ; ha ha ! modification par le client!
$old=$encours
ConsoleWrite($encours&@CRLF)
EndIf
WEnd
;Run("client")
Code : Tout sélectionner
; le "client" qui est appelé via le "partageur" qui lui donne son PID et l'adresse de la valeur mise à dispo
#include "memory.au3" ; librairie de gestion de memoire en RAM
$cpt=0
If $CmdLine[0]<>2 Then Exit 1 ; on attends 2 arg : PID + adresse (pointeur)
$pid=$CmdLine[1]
$adress=$CmdLine[2]
;boucle d'update qui va faire +1 toute les 2 secondes
While 1
$cpt+=1
updatememory($pid,$adress,$cpt)
Sleep(2000)
WEnd
Func updatememory($process_id,$adress_mem,$val)
;Local $offset=0
Local $DllHandle = _MemoryOpen($process_id); on ouvre la partie de mémoire utilisée par le pid de l'appelant
Local $Data = _MemoryWrite($adress_mem, $DllHandle,$cpt,"int"); on écrit à l'adresse passer en arg la valeur typée en int (type original de la valeures dont l'adresse a été passée)
_MemoryClose($DllHandle) ;on referme le handle ouvert sur cette zone
EndFunc
point positif : c'est plus rapide et pas de rémanence comme avec les stockage sur support magnétique (sauf ram magnétiques mais ça court pas les rues)
point négatif : les accès concurentiels... et oui car mêm si on n'a pas les lourdeurs du fileopen, write et close, la problèmatique reste la même : que se passe t il si un process (voir plusieurs, c'est le pire cas ) écrit au moment où l'autre lit, que se passe t il ? des bugs de valeurs, voir plantage (mais ceci reste vrai pour tout type de partage).
Quant on n'a que deux petites applis popote maison , ça va, on peut négliger cette aspect, mais si on parle d'appli attaquée par plusierus clients, alors faut passer à la prise de jeton d'accès : l'art de la sémaphorisation, mais ceci sera un autre tuto

Edit Tlem : Vous trouverez dans le lien qui suit, une autre solution pour le transfert de donnée(s). Cette méthode, prend en compte les variables de tous types (y compris les tableaux), ainsi que des objets COM.
http://www.autoitscript.com/forum/topic ... _p__880884
.