Partage de mémoire entre processus

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Partage de mémoire entre processus

Message par nico »

IL faut lancer les deux programmes, le premier programme envoie les données et le deuxième les réceptionne.

Code : Tout sélectionner

; Petit exemple simple de démonstration de partage de mémoire
; CreatefileMapping: retourne le Handle de l'objet mémoire identifié par le nom "Mapping"
; si celui-ci n'existe pas, il le crée
; MapViewOfFile: permet d'obtenir un pointeur d'accès sur cette zone mémoire.
; Tout processus souhaitant travaillé avec cette zone de mémoire doit appelé ces deux API
; à vous ensuite de gérer les processus afin qu'ils accèdent aux données de manière cohérente
; afin de s'assurer que les données aient été lues avant d'être modifiées

  Enumeration
    #Window
    #StringGadget
    #BOUTON
  EndEnumeration
   
  Structure Partage
    valeur1.l
    valeur2.l
    valeur3.l
    valeur4.l
  EndStructure 
 
  Global *VueDonnees.Partage  
  
  If OpenWindow(#Window,0,0,160,160,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Mapping Envoie")
    CreateGadgetList(WindowID(#Window))
    StringGadget(#StringGadget,10, 10,100,20,"123456789") 
    ButtonGadget(#BOUTON, 10, 90, 100, 20, "Envoyer")
    
    MemoirePartagee=CreatefileMapping_($FFFFFFFF,#null, #PAGE_READWRITE, 0, SizeOf(Partage),"Mapping")
    *VueDonnees=MapViewOfFile_(MemoirePartagee, #FILE_MAP_WRITE, 0, 0, 0)
    
    Repeat
      EventID.l=WaitWindowEvent()
      Select EventID
          
        Case #PB_EventGadget
          Select EventGadgetID() 
            Case #BOUTON
              Donnee1$=GetGadgetText(#StringGadget)
              Donnee1=Val(Donnee1$)
              *VueDonnees\valeur1=Donnee1
              ;MessageRequester("Info",Str(*VueDonnees\valeur1)) 
          EndSelect
          
       Case #WM_CLOSE
          Quit=1
      EndSelect 
    Until Quit=1 
  EndIf      


Code : Tout sélectionner

Enumeration
  #Window
  #StringGadget
  #BOUTON
EndEnumeration
  
Structure Partage
  valeur1.l
  valeur2.l
  valeur3.l
  valeur4.l
EndStructure 
 
Global *VueDonnees.Partage  
  
If OpenWindow(#Window,0,0,160,160,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Mapping Reçoit")
  CreateGadgetList(WindowID(#Window))
  StringGadget(#StringGadget,10, 10,100,20,"") 
  ButtonGadget(#BOUTON, 10, 90, 100, 20, "Recevoir")
  
  MemoirePartagee=CreatefileMapping_($FFFFFFFF,#null, #PAGE_READWRITE, 0, SizeOf(Partage),"Mapping") 
  *VueDonnees=MapViewOfFile_(MemoirePartagee, #FILE_MAP_WRITE, 0, 0, 0)
    
  Repeat
    EventID.l=WaitWindowEvent()
    Select EventID
      
      Case #PB_EventGadget
        Select EventGadgetID() 
          Case #BOUTON
            SetGadgetText(#StringGadget,Str(*VueDonnees\valeur1))
            ;MessageRequester("Info",Str(*VueDonnees\valeur1)) 
        EndSelect
         
      Case #WM_CLOSE
        Quit=1
    EndSelect 
  Until Quit=1 
EndIf           
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Super !
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Un autre exemple plus sympa:

La fenêtre qui reçoit les évènements de la souris transmet à l'autre fenêtre les même coordonnées quel que soit la fenêtre Processus 1 ou Processus 2 où se trouve la souris.

Code : Tout sélectionner

  Enumeration
  #Window
  #StringGadget
  EndEnumeration
    
  Structure Partage
    valeur1.l
    valeur2.l
    valeur3.l
    valeur4.l
  EndStructure 
  
  #WM_MONMESSAGE=111
  
  Global *VueDonnees.Partage 
  
  Procedure WindowCallback(WindowID,Message,wParam,lParam) 
    res=#PB_ProcessPureBasicEvents 
    Select Message  
      Case #WM_MONMESSAGE
        If wParam=1 And lParam=1
          SetGadgetText(#StringGadget,"x= "+Str(*VueDonnees\valeur1)+"    y= "+Str(*VueDonnees\valeur2))
        EndIf
    EndSelect 
    ProcedureReturn res 
  EndProcedure 
 
  If OpenWindow(#Window,0,0,160,160,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Processus 1")
  CreateGadgetList(WindowID(#Window))
  StringGadget(#StringGadget,10, 10,100,20,"") 
  
  MemoirePartagee=CreatefileMapping_($FFFFFFFF,#null, #PAGE_READWRITE, 0, SizeOf(Partage),"Mapping") 
  *VueDonnees=MapViewOfFile_(MemoirePartagee, #FILE_MAP_WRITE, 0, 0, 0)
  
  SetWindowCallback(@WindowCallback())
  
  Repeat
    EventID.l=WaitWindowEvent()
    Select EventID 
      Case  #WM_MOUSEMOVE
        Hdle=FindWindow_(0,"Processus 2")
        *VueDonnees\valeur1 = WindowMouseX() 
        *VueDonnees\valeur2=  WindowMouseY() 
        SetGadgetText(#StringGadget,"x= "+Str(*VueDonnees\valeur1)+"    y= "+Str(*VueDonnees\valeur2))
        If Hdle
          SendMessage_(Hdle, #WM_MONMESSAGE, 1, 1)
        EndIf
        
      Case #WM_CLOSE
        Quit=1
    EndSelect 
  Until Quit=1 
EndIf

Code : Tout sélectionner

  Enumeration
    #Window
    #StringGadget
  EndEnumeration
      
  Structure Partage
    valeur1.l
    valeur2.l
    valeur3.l
    valeur4.l
  EndStructure 
    
  #WM_MONMESSAGE=111
    
  Global *VueDonnees.Partage 
    
  Procedure WindowCallback(WindowID,Message,wParam,lParam) 
    res=#PB_ProcessPureBasicEvents 
    Select Message  
      Case #WM_MONMESSAGE
        If wParam=1 And lParam=1
          SetGadgetText(#StringGadget,"x= "+Str(*VueDonnees\valeur1)+"    y= "+Str(*VueDonnees\valeur2))
        EndIf
    EndSelect 
    ProcedureReturn res 
  EndProcedure 
 
If OpenWindow(#Window,0,0,160,160,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Processus 2")
  CreateGadgetList(WindowID(#Window))
  StringGadget(#StringGadget,10, 10,100,20,"") 
  
  MemoirePartagee=CreatefileMapping_($FFFFFFFF,#null, #PAGE_READWRITE, 0, SizeOf(Partage),"Mapping") 
  *VueDonnees=MapViewOfFile_(MemoirePartagee, #FILE_MAP_WRITE, 0, 0, 0)
  
  SetWindowCallback(@WindowCallback())
  
  Repeat
    EventID.l=WaitWindowEvent()
    Select EventID 
      Case  #WM_MOUSEMOVE
          Hdle=FindWindow_(0,"Processus 1")
          *VueDonnees\valeur1 = WindowMouseX() 
          *VueDonnees\valeur2=  WindowMouseY() 
          SetGadgetText(#StringGadget,"x= "+Str(*VueDonnees\valeur1)+"    y= "+Str(*VueDonnees\valeur2))
          If Hdle
            SendMessage_(Hdle, #WM_MONMESSAGE, 1, 1)
          EndIf
      Case #WM_CLOSE
        Quit=1
    EndSelect 
  Until Quit=1 
EndIf
Répondre