Static, Global et Thread
Publié : lun. 26/sept./2005 20:33
D'abord merci à Dri pour le coup de pouce sur les interfaces, j'ai à peu près capté le machin 
Donc ici j'ai ceci:
Comme on peut le constater y'a un Global où sont stockés des adresses des procédures. Dans le constructeur on assigne au nouvel objet la table virtuelle avec ce Global.
J'ai essayé de faire une "simple" variable dans la procédure (donc pas globale) et de l'assigner mais ça plante.
Dri m'a proposé de faire une variable statique dans la procédure et cela fonctionne.
Mon soucis est de savoir si le Global et/ou le Static peuvent poser des problèmes si on utilise l'objet dans des threads.
Si oui, comment détourner la chose pour avoir un objet qui résiste au threads ?

Donc ici j'ai ceci:
Code : Tout sélectionner
; on déclare les fonctions de notre objet dans une Interface
Interface Math_Interface
SetX(x)
SetY(y)
Add()
Free()
EndInterface
; on déclare une structure pour y stocker les adresses des procédures
Structure Math_Virtual
SetX.l
SetY.l
Add.l
Free.l
EndStructure
; on déclare la structure "interne" de l'objet
Structure Math_Object
*Virtual.Math_Virtual
x.l
y.l
EndStructure
; nos procédures
Procedure SetX(*Object.Math_Object, x)
*Object\x = x
EndProcedure
Procedure SetY(*Object.Math_Object, y)
*Object\y = y
EndProcedure
Procedure Add(*Object.Math_Object)
ProcedureReturn *Object\x + *Object\y
EndProcedure
Procedure Free(*Object.Math_Object)
FreeMemory(*Object)
EndProcedure
; ici on déclare une variable globale contenant les adresses des procédures
Global Math_Global.Math_Virtual
Math_Global\SetX = @SetX()
Math_Global\SetY = @SetY()
Math_Global\Add = @Add()
Math_Global\Free = @Free()
; une procédure d'initialisation qui permet de "créer" un nouvel objet en mémoire, on retourne le pointeur de cet objet
Procedure.l NewMath_Object()
*new.Math_Object = AllocateMemory(SizeOf(Math_Object))
*new\Virtual = Math_Global
ProcedureReturn *new
EndProcedure
; création d'un nouvel objet dans le programme
MonMath.Math_Interface = NewMath_Object()
; utilisation des procédures de l'objet
MonMath\SetX(5)
MonMath\SetY(2)
Debug = MonMath\Add()
; on détruit l'objet
MonMath\Free()
J'ai essayé de faire une "simple" variable dans la procédure (donc pas globale) et de l'assigner mais ça plante.
Dri m'a proposé de faire une variable statique dans la procédure et cela fonctionne.
Code : Tout sélectionner
...
Procedure.l NewMath_Object()
Static Math_Global.Math_Virtual
Math_Global\SetX = @SetX()
Math_Global\SetY = @SetY()
Math_Global\Add = @Add()
Math_Global\Free = @Free()
*new.Math_Object = AllocateMemory(SizeOf(Math_Object))
*new\Virtual = Math_Global
ProcedureReturn *new
EndProcedure
...
Si oui, comment détourner la chose pour avoir un objet qui résiste au threads ?