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

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

)
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

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 :
en
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 :
Dri
Publié : jeu. 08/mars/2007 18:06
par Progi1984
Si je fais ca, ca buggue et me redonne l'erreur là haut
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
?? a transformer en :
/ => \ ???