[MODULE] properties

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

[MODULE] properties

Message par microdevweb »

Bonjour à tous voici un module a un stade de test de synchronisation de propriétés, le but étant par après de pouvoir faire par exemple des nouveau gadgets qui hériterais de ces propriétés.

Je l'avoue cette idée me vient de Java et JavaFx :roll:

(et pour une fois ce n'est pas en style objet :mrgreen: )

Remarque ne gère actuellement que les long

ATTENTION : utilise les threads avec une synchronisation du type Producteur / Consomateur il est donc préférable d'activer la gestion de threads dans les options de compilation

Image

Code de l'exemple

Code : Tout sélectionner


XIncludeFile "properties.pbi"

#MAIN_FORM = 0
#PROPERTY_1 = 0
Enumeration 
  #TRACK
  #TEXT
  #BAR
EndEnumeration

Procedure exit()
  End
EndProcedure

Procedure syncBar(id,type)
  SetGadgetState(#BAR,PROPERTIES::getLongValue(#PROPERTY_1))
EndProcedure

Procedure syncText(id,type)
  SetGadgetText(#TEXT,"VALUE = "+Str(PROPERTIES::getLongValue(#PROPERTY_1)))
EndProcedure


Procedure evTrack()
  PROPERTIES::setLongValue(#PROPERTY_1,GetGadgetState(#TRACK))
EndProcedure

Procedure start()
  PROPERTIES::newProperty(#PROPERTY_1,PROPERTIES::#LONG_PROPERTY)
  OpenWindow(#MAIN_FORM,0,0,400,150,"Test properties",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  StringGadget(#TEXT,10,10,380,30,"")
  TrackBarGadget(#TRACK,10,50,380,30,0,100)
  ProgressBarGadget(#BAR,10,90,380,30,0,100)
  PROPERTIES::bind(#PROPERTY_1,@syncBar())
  PROPERTIES::bind(#PROPERTY_1,@syncText())
  BindEvent(#PB_Event_CloseWindow,@exit(),#MAIN_FORM)
  BindGadgetEvent(#TRACK,@evTrack())
EndProcedure

start()

Repeat
  WaitWindowEvent()
ForEver
Code du module

Code : Tout sélectionner

;{----------------------------------------------
; PACKAGE NAME  : PROPERTIES
; AUTHOR        : MICRODEVWEB
; DATE          : 2020/02/20
; MAJOR VERSION : 1
; MINOR VERSION : 0
;}----------------------------------------------
DeclareModule PROPERTIES
  Enumeration 
    #LONG_PROPERTY
    #DOUBLE_PROPERTY
    #FLOAT_PROPERTY
    #STRING_PROPERTY
  EndEnumeration
  Declare newProperty(Idproperty,TypeProperty)
  Declare getLongValue(Idproperty)
  Declare setLongValue(Idproperty,value)
  Declare bind(Idproperty,*callback)
EndDeclareModule
Module PROPERTIES
  EnableExplicit
  Prototype callback(property,type)
  #BUFFER_LEN = 10
  
  Structure _fifo
    Array  *buffer(#BUFFER_LEN) 
    input.i
    output.i
    items.i
    spaces.i
    mutex.i
  EndStructure
  Structure _pro
    List *callback()
    type.l
    thread.l
    fifo._fifo
    id.l
  EndStructure
  Structure _long Extends _pro
    value.l
  EndStructure
  Structure _double Extends _pro  
    value.d
  EndStructure
  Structure _float Extends _pro  
    value.f
  EndStructure
  Structure _string Extends _pro  
    value.s
  EndStructure
  
  
  
  Global NewMap myProperties._pro()
  Global mutex = CreateMutex()
  
  Declare pop(*property._pro)
  
  Procedure synchronize(*property._pro)
    Protected call.callback
    Repeat
      call = pop(*property)
      call(*property\id,*property\type)
    ForEver 
  EndProcedure
  
  Procedure push(*property._pro,*callback)
    With *property\fifo
      WaitSemaphore(\spaces)                      ; wait for space into the buffer
      LockMutex(\mutex)                           ; mutual exclusion
      \buffer(\input) = *callback                ; push into the list
      \input +1                                   ; next list position
                                                  ; manage circular list
      If \input >= #BUFFER_LEN                    ; uper to buufer length
        \input = 0 
      EndIf
      UnlockMutex(\mutex)                         ; end of mutual exclusion
      SignalSemaphore(\items)                     ; tel data available
    EndWith
  EndProcedure
  
  Procedure pop(*property._pro)
    With *property\fifo
      Protected *returned_value = 0
      WaitSemaphore(\items)               ; wait for data available
      LockMutex(\mutex)                   ; mutual exclusion
      *returned_value = \buffer(\output)   ; load from the List
      \output +1                          ; next list position
                                          ; manage circular list
      If \output >= #BUFFER_LEN           ; uper to bufer length
        \output = 0 
      EndIf
      UnlockMutex(\mutex)                 ; End of mutual exclusion
      SignalSemaphore(\spaces)            ; tel space available
      ProcedureReturn  *returned_value
    EndWith
  EndProcedure
  
  Procedure newProperty(Idproperty,TypeProperty)
    If Not FindMapElement(myProperties(),Str(Idproperty))
      AddMapElement(myProperties(),Str(Idproperty))
      myProperties()\type = TypeProperty
      myProperties()\id = Idproperty
      myProperties()\fifo\mutex = CreateMutex()
      myProperties()\fifo\items = CreateSemaphore(0)
      myProperties()\fifo\spaces = CreateSemaphore(#BUFFER_LEN)
    EndIf
  EndProcedure
  
  Procedure getLongValue(Idproperty)
    Protected vRet
    If FindMapElement(myProperties(),Str(Idproperty))
      LockMutex(myProperties()\fifo\mutex)
      Define *v._long = myProperties()
      vRet = *v\value 
      UnlockMutex(myProperties()\fifo\mutex)
    EndIf
    ProcedureReturn vRet
  EndProcedure
  
  Procedure setLongValue(Idproperty,value)
    If FindMapElement(myProperties(),Str(Idproperty))
      LockMutex(myProperties()\fifo\mutex)
      Define *v._long = myProperties()
      *v\value = value
      ForEach myProperties()\callback()
        push(myProperties(),myProperties()\callback())
      Next
      UnlockMutex(myProperties()\fifo\mutex)
    EndIf
    
  EndProcedure
  
  Procedure bind(Idproperty,*callback)
    If FindMapElement(myProperties(),Str(Idproperty))
      LockMutex(myProperties()\fifo\mutex)
      AddElement(myProperties()\callback())
      myProperties()\callback() = *callback
      If Not myProperties()\thread
        myProperties()\thread = CreateThread(@synchronize(),@myProperties())
      EndIf
      UnlockMutex(myProperties()\fifo\mutex)
    EndIf
  EndProcedure
  
EndModule
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [MODULE] properties

Message par Ar-S »

Merci, c'est propre.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: [MODULE] properties

Message par Kwai chang caine »

Oui, code complex comme dab :wink: mais résultat propre :D
Merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre