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 ...

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
[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
[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.
