Page 2 sur 3

Publié : mar. 27/juin/2006 11:40
par Flype
encore mieux ( çà reste toutefois à confirmer/tester ) :

Code : Tout sélectionner

Import #PB_Compiler_Home + "Compilers/ObjectManager.lib"
  PB_Object_GetOrAllocateID (Objects, Object.l) 
  PB_Object_GetObject       (Objects, Object.l) 
  PB_Object_IsObject        (Objects, Object.l) 
  PB_Object_EnumerateAll    (Objects, ObjectEnumerateAllCallback, *VoidData) 
  PB_Object_EnumerateStart  (Objects) 
  PB_Object_EnumerateNext   (Objects, *object.Long) 
  PB_Object_EnumerateAbort  (Objects) 
  PB_Object_FreeID          (Objects, Object.l) 
  PB_Object_Init            (StructureSize.l, IncrementStep.l, ObjectFreeFunction) 
  PB_Object_GetThreadMemory (MemoryID.l) 
  PB_Object_InitThreadMemory(Size.l, InitFunction, EndFunction) 
EndImport

Publié : mar. 27/juin/2006 11:58
par Dr. Dri
Génial! Voila une version qui reprend mon exemple (en virant les "PB_")

Code : Tout sélectionner

Import #PB_Compiler_Home + "Compilers/ObjectManager.lib"
  Object_GetOrAllocateID (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_FreeID          (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
Dri :10:

Publié : mar. 27/juin/2006 12:07
par Flype
hehe, je me suis fais la même mais avec
DATABASE_IsObject(),
DATABASE_GetObject(),
DATABASE_GetOrAllocate(),
...

sinon, est-ce que d'apres toi cet API est chargé deux fois en mémoire (par le compilateur, puis par le Import/EndImport ) ?

Publié : mar. 27/juin/2006 12:13
par Dr. Dri
Je ne pense pas, mais ce serait à confirmer...
Sinon je préfère garder "Object" parce que c'est générique ^^

Dri

Publié : mar. 27/juin/2006 14:27
par gnozal
oui, çà fonctionne bien (même avec jaPBe :wink: )

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

Publié : mar. 27/juin/2006 20:28
par poshu
Wunderbach!

Merci

Publié : mar. 27/juin/2006 22:45
par Flype
oui, çà fonctionne bien (même avec jaPBe )
meme l'autre version a fini par fonctionner avec jaPBe :wink:

Publié : mar. 09/janv./2007 10:04
par Progi1984
Pas de pb avec la V4.02 ?

Publié : lun. 15/janv./2007 12:05
par Progi1984
Aprés test, pas de problèmes !!!!

Publié : jeu. 08/mars/2007 11:40
par Progi1984
J'ai besoin de compiler une lib avec Tailbite....
Qui utilise le #PB_Any (merci :) )

Donc je mets cela au début de mon code

Code : Tout sélectionner

Import #PB_Compiler_Home + "Compilers/ObjectManager.lib"
  PB_Object_GetOrAllocateID (Objects, Object.l)
  PB_Object_GetObject       (Objects, Object.l)
  PB_Object_IsObject        (Objects, Object.l)
  PB_Object_EnumerateAll    (Objects, ObjectEnumerateAllCallback, *VoidData)
  PB_Object_EnumerateStart  (Objects)
  PB_Object_EnumerateNext   (Objects, *object.Long)
  PB_Object_EnumerateAbort  (Objects)
  PB_Object_FreeID          (Objects, Object.l)
  PB_Object_Init            (StructureSize.l, IncrementStep.l, ObjectFreeFunction)
  PB_Object_GetThreadMemory (MemoryID.l)
  PB_Object_InitThreadMemory(Size.l, InitFunction, EndFunction)
EndImport 
et quand je compile avec Tailbite, j'ai ce message d'erreur :

Code : Tout sélectionner

polib:
POLIB: fatal error: File Not Found 'TBTemp\Functions\TB_Imported_Lib_0.lib'

Le canal de communication a été fermé.

Publié : jeu. 08/mars/2007 12:33
par Progi1984
J'ai trouvé la solution :

Il faut que je transforme :

Code : Tout sélectionner

Import #PB_Compiler_Home + "Compilers/ObjectManager.lib" 
en

Code : Tout sélectionner

Import "C:\Perso\PureBasic\Compilers\ObjectManager.lib"
sinon j'ai le bug précédent

Publié : jeu. 08/mars/2007 17:07
par Dr. Dri
et ca donne quoi si tu fais un debug #PB_Compiler_Home ?
faut peut être juste faire ca :

Code : Tout sélectionner

Import #PB_Compiler_Home + "/Compilers/ObjectManager.lib"
Dri

Publié : jeu. 08/mars/2007 18:06
par Progi1984
Si je fais ca, ca buggue et me redonne l'erreur là haut

Code : Tout sélectionner

Debug #PB_Compiler_Home
Résultat :
C:\Perso\PureBasic\

Publié : jeu. 08/mars/2007 19:25
par Dr. Dri
et ce code te donne quoi ?

Code : Tout sélectionner

object.s = #PB_Compiler_Home + "Compilers/ObjectManager.lib"

Debug object
Debug FileSize(object)
Dri :?:

Publié : ven. 09/mars/2007 14:23
par lionel_om
Le problème ne vient pas de

Code : Tout sélectionner

"Compilers/ObjectManager.lib"
?? a transformer en :

Code : Tout sélectionner

"Compilers\ObjectManager.lib"
/ => \ ???