Page 1 sur 1

multi thread et pointeurs

Publié : ven. 11/nov./2005 15:30
par fra
salut
j'ai créé deux aplis sensées tourner en parrallèle (multi thread) de sorte a pouvoir effectuer certaines longues taches ou répétitives cependant je n'arrive pas a modifier les variable entre deux programmes sans que l' on m'informe d'une violation d' accès mémoire
en clair : le prog A ne peut pas modifier les variables du prog B
est ce que vous savez comment je pourrais faire
merci

Publié : ven. 11/nov./2005 16:32
par Dr. Dri
c'est normal, pour accéder a la mémoire d'un autre processus il faut passer par l'api... Regarde du côté de PBOSL

Dri

Publié : ven. 11/nov./2005 16:44
par lionel_om
Deux applis :
Tu parle de deux Threads ou deux EXE ???

Si c'est deux theads, faut que ets variables soient globales ... :wink:

Publié : ven. 11/nov./2005 16:48
par fra
je parle bel et bien de deux applis
mais je ne trouve pas d' info sur pbosl
est ce que vous pourriez m'aider un tout petit peu plus ;) ?

Publié : ven. 11/nov./2005 17:22
par KarLKoX
Un SendMessage avec WM_COPYDATA suffira pour ce que tu demandes, selon le message que l'une de tes deux applis interceptera, elle initialisera telle ou telle variable.
Exemple :

A envoye WM_RESET_INIFFILE à B, B reset donc le fichier init et les variables correspondantes et vice versa.
Plus d'informations ici.
Tu pourras même envoyer des données (pointeur sur structure) si tu le souhaites.

Publié : ven. 11/nov./2005 18:08
par Dr. Dri
tient je connais pas le message copydata ^^
Je vais regarder ca de plus près :D

[edit]
je viens de tilter, ca ne fonctionne que pour les programmes fenêtrés
sinon c'est toujours bon à savoir ^^

Dri

Publié : ven. 11/nov./2005 18:26
par fra
merci pour toutes vos idées
j' ai cependant persévéré dans la proposition du début ( pbosl ) et cela a porté ses fruits
PBOSL_AllocateMemoryGlobal
cette fonction permet en effet de gerer un même espace mémoire avec plusieurs applications :)
je pense donc que je ferais comme sa.
cependant, toutes vos remarque/suggesions sont les bienvenues
encore une fois merci et a trés bientot

Publié : ven. 11/nov./2005 19:57
par KarLKoX
Dr. Dri>tu n'est pas obligé de créér une fenêtre visible (cf les wrappers winamp par exemple)

fra>tu as la possibilité de créer un espace de mémoire partagé via CreateFileMapping.

Publié : ven. 11/nov./2005 19:58
par Chris
Dr. Dri a écrit :tient je connais pas le message copydata ^^
Je vais regarder ca de plus près :D

[edit]
je viens de tilter, ca ne fonctionne que pour les programmes fenêtrés
sinon c'est toujours bon à savoir ^^

Dri
C'est ce qui est utilisé dans jaPBe pour coller des données dans l'éditeur.

Code : Tout sélectionner

;/Constantes Window
Enumeration
  #Window_0
EndEnumeration

;/Constantes Gadget
Enumeration
  #Edit
  #Bouton
  #Btn_Quit
EndEnumeration

;/ Constantes diverses
Enumeration 1
  #WMCD_OpenFile              ; Ouvre un fichier dans une nouvelle page
  #WMCD_InsertText            ; Insère le texte à la position du curseur.
  #WMCD_ReplaceCompleteText   ; Remplace la totalité du texte
  #WMCD_ReplaceCurrentLine    ; Remplace la ligne ou se trouve le curseur
  #WMCD_NewText               ; Ouvre un nouvel onglet, et lui passe le texte
EndEnumeration

; MainWin : Handle de la fenêtre qui envoie les données
; Data$   : Données
; Mode    : Type d'envoi, défini par les constantes ci-dessus
;
Procedure SendDatasToEditor(MainWin, Datas$, Mode.l)
  RunOneWin = FindWindow_(@"WindowClass_0",@"jaPBe-RunOneWindow")
  If RunOneWin
    If Datas$
      cd.COPYDATASTRUCT
      cd\dwData = Mode
      cd\cbData = Len(Datas$)+1
      cd\lpData = @Datas$
      SendMessage_(RunOneWin, #WM_COPYDATA, MainWin, cd)  
    EndIf
  EndIf
EndProcedure


If OpenWindow(#Window_0, 300, 300, 300, 200, #PB_Window_SystemMenu, "Fenêtre 1",0)
  If CreateGadgetList(WindowID(#Window_0))
    StringGadget(#Edit, 10, 10, 280, 20, "Un petit texte de démonstration.")
    ButtonGadget(#Bouton, 10, 40, 280, 20, "Envoyer")
    ButtonGadget(#Btn_Quit, 100, 170, 100, 25, "Quitter")
  EndIf
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_EventGadget
        Select EventGadgetID()
          Case #Bouton
            Texte.s = GetGadgetText(#Edit)
            If Texte <> ""
              SendDatasToEditor(WindowID(#Window_0), "Chaine.s = " + Chr(34)+Texte+Chr(34), #WMCD_NewText)
            EndIf
            
          Case #Btn_Quit
            quit = 1
        EndSelect
        
      Case #PB_EventCloseWindow : quit = 1
    EndSelect
  Until quit = 1
  End
EndIf

Publié : ven. 11/nov./2005 20:24
par nico
Faut chercher un peu , j'ai posté plusieurs exemples sur l'échange de données entre process, WM_COPYDATA, fichiers mappés et pipes nommés.

:)