Code : Tout sélectionner
; /////////////////////////////////////////////////////////// 
;                          C O D E 
; /////////////////////////////////////////////////////////// 
; 
CompilerIf #PB_Compiler_Thread ;> 
  #ObjectManager = "Compilers/ObjectManagerThread.lib"
CompilerElse ;=
  #ObjectManager = "Compilers/ObjectManager.lib"
CompilerEndIf;<
Import #PB_Compiler_Home + #ObjectManager
  Object_GetOrAllocate   (Objects, Object.l) As "_PB_Object_GetOrAllocateID@8" 
  Object_GetObject       (Objects, Object.l) As "_PB_Object_GetObject@8" 
  Object_IsObject        (Objects, Object.l) As "_PB_Object_IsObject@8" 
  Object_EnumerateAll    (Objects, ObjectEnumerateAllCallback, *VoidData) As "_PB_Object_EnumerateAll@12" 
  Object_EnumerateStart  (Objects) As "_PB_Object_EnumerateStart@4" 
  Object_EnumerateNext   (Objects, *object.Long) As "_PB_Object_EnumerateNext@8" 
  Object_EnumerateAbort  (Objects) As "_PB_Object_EnumerateAbort@4" 
  Object_Free            (Objects, Object.l) As "_PB_Object_FreeID@8" 
  Object_Init            (StructureSize.l, IncrementStep.l, ObjectFreeFunction) As "_PB_Object_Init@12" 
  Object_GetThreadMemory (MemoryID.l) As "_PB_Object_GetThreadMemory@4" 
  Object_InitThreadMemory(Size.l, InitFunction, EndFunction) As "_PB_Object_InitThreadMemory@12" 
EndImport
Prototype ObjectFreeFunction(Object.l) 
Structure PB_SimpleList 
  *Next    .PB_SimpleList 
  *Previous.PB_SimpleList 
EndStructure 
Structure PB_Object 
  ; 
  StructureSize.l 
  IncrementStep.l 
  ObjectsNumber.l 
  *ListFirstElement.PB_SimpleList 
  ; 
  FreeObject.ObjectFreeFunction 
  ; 
  Current.l 
  *CurrentElement.PB_SimpleList 
  ; 
  CompilerIf #PB_Compiler_Thread ;> 
    IncrementShift.l 
    *FirstObjectsArea.PB_SimpleList 
    *LastObjectsArea .PB_SimpleList 
    ObjectMutex.CRITICAL_SECTION 
  CompilerElse ;= 
    *ObjectsArea 
  CompilerEndIf ;< 
  ; 
EndStructure 
; 
; /////////////////////////////////////////////////////////// 
;                          E X A M P L E 
; /////////////////////////////////////////////////////////// 
; 
;la structure qui contient les 
;informations sur les timers 
Structure Timer 
  Event.l 
  Window.l 
  Elapse.l 
EndStructure 
;il faut que ce soit global ^^ 
;ou alors shared dans chaque fonction 
Global TimerObjects 
;la fonction la plus importante, sans elle 
;pas d'objets statiques/dynamiques 
Procedure.l FreeTimer(Timer.l) 
  Protected Free.l = #False, *Timer.Timer 
  
  If Timer <> #PB_Any And Object_IsObject(TimerObjects, Timer) 
    *Timer = Object_GetObject(TimerObjects, Timer) 
  EndIf 
  
  If *Timer And IsWindow(*Timer\Window) 
    Free = KillTimer_(WindowID(*Timer\Window), *Timer\Event) 
    Object_Free(TimerObjects, Timer) 
  EndIf 
  
  ProcedureReturn Free 
EndProcedure 
;Retourne "non-zero" si le timer a été créé 
;Retourne l'index du timer si Timer = #PB_Any 
Procedure.l CreateTimer(Timer.l, Window.l, Event.l, Elapse.l) 
  Protected Create.l = #Null, *Timer.Timer 
  
  If IsWindow(Window) And Event 
    FreeTimer(Timer) 
    *Timer = Object_GetOrAllocate(TimerObjects, Timer) 
  EndIf 
  
  If *Timer 
    SetTimer_(WindowID(Window), Event, Elapse, #Null) 
    *Timer\Event  = Event 
    *Timer\Window = Window 
    *Timer\Elapse = Elapse 
  EndIf 
  
  If Timer = #PB_Any 
    Create = *Timer 
  ElseIf *Timer 
    Create = *Timer\Event 
  EndIf 
  
  ProcedureReturn Create 
EndProcedure 
;trois fonctions pour meubler 
Procedure.l GetTimerEvent(Timer.l) 
  Protected Event.l = #PB_Any, *Timer.Timer 
  
  *Timer = Object_GetObject(TimerObjects, Timer) 
  
  If *Timer And IsWindow(*Timer\Window) 
    Event = *Timer\Event 
  EndIf 
  
  ProcedureReturn Event 
EndProcedure 
Procedure.l GetTimerWindow(Timer.l) 
  Protected Window.l = #PB_Any, *Timer.Timer 
  
  *Timer = Object_GetObject(TimerObjects, Timer) 
  
  If *Timer And IsWindow(*Timer\Window) 
    Window = *Timer\Window 
  EndIf 
  
  ProcedureReturn Window 
EndProcedure 
Procedure.l GetTimerElapse(Timer.l) 
  Protected Elapse.l = #PB_Any, *Timer.Timer 
  
  *Timer = Object_GetObject(TimerObjects, Timer) 
  
  If *Timer And IsWindow(*Timer\Window) 
    Elapse = *Timer\Elapse 
  EndIf 
  
  ProcedureReturn Elapse 
EndProcedure 
;si on fait une lib autant 
;créer les évennements qui vont avec ^^ 
#PB_Event_Timer = #WM_TIMER 
;retourne le numéro de timer (#PB_Any s'il n'existe pas) 
Procedure.l EventTimer() 
  Protected Window.l, Event.l, Temp.l 
  Protected Timer.l = #PB_Any, *Timer.Timer 
  
  Window = EventWindow() 
  Event  = EventwParam() 
  
  Object_EnumerateStart(TimerObjects) 
  
  While Object_EnumerateNext(TimerObjects, @Temp) 
    *Timer = Object_GetObject(TimerObjects, Temp) 
    
    If *Timer\Window = Window And *Timer\Event = Event 
      Object_EnumerateAbort(TimerObjects) 
      Timer = Temp 
    EndIf 
  Wend 
  
  ProcedureReturn Timer 
EndProcedure 
;crée la liste d'objets des timers, 
;je ne sais pas à quoi correspond le 2e argument 
TimerObjects = Object_Init(SizeOf(Timer), 1, @FreeTimer()) 
;fin de la "lib" 
;------------------------------------------------------------------------------- 
;début du programme 
Enumeration 
  #Timer_A 
  #Timer_C 
EndEnumeration 
If OpenWindow(0, 0, 0, 222, 50, "Timer", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  CreateGadgetList(WindowID(0)) 
  
  ButtonGadget(0, 10, 10, 200, 30, "Timer", #PB_Button_Toggle) 
  
  CreateTimer(#Timer_A, 0, 6, 2000) 
  CreateTimer(#Timer_C, 0, 2, 1500) 
  
  Repeat 
    
    Event = WaitWindowEvent() 
    
    If Event = #PB_Event_Gadget 
      
      If GetGadgetState(0) 
        Timer = CreateTimer(#PB_Any, 0, 1, 1000) 
      Else 
        FreeTimer(Timer) 
      EndIf 
      
    ElseIf Event = #PB_Event_Timer 
      
      Select EventTimer() 
        Case #Timer_A 
          Debug "#Timer_A" 
          
        Case #Timer_C 
          Debug "#Timer_C" 
          
        Case Timer 
          Debug "Timer" 
          
      EndSelect 
      
    EndIf 
    
  Until Event = #PB_Event_CloseWindow 
EndIf