Funciones timers

Started by Phreak, March 17, 2008, 08:13:48 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Phreak

Hola gente!
Despues de tanto tiempo, poco a poco estoy volviendo
Estas son un par de funciones para crear todos los timers ke deseen ..
Las hice para el perla, pero capaz ke a alguien le sirvan..
aca va el codigo y un ejemplito...

Saludos!!

TIMERS_FUNCTIONS.PRG:
[code language="bennu"]
//------------------------------------//
//Tipo timer
//------------------------------------//
TYPE TYPE_Timer
   INT value;
   TYPE_Timer POINTER next;
END

#DEFINE MyTimer INT*

//------------------------------------//
//Puntero global a timers
//------------------------------------//
GLOBAL
   TYPE_Timer POINTER timers;
END


//------------------------------------//
//Timer manager
//------------------------------------//
PROCESS Timers_Start()   
PRIVATE
   INT ultimo=0,incremento;
   TYPE_Timer POINTER aux;
BEGIN
   //Crea un timer base
   timers=alloc(sizeof(TYPE_Timer));
   [timers].value=0;
   [timers].next=NULL;

   LOOP
      //Calcula incremento
      incremento=get_timer()-ultimo;
      ultimo=get_timer();
      
      //Incrementa todos los timers
      aux=timers;
      WHILE ([aux].next)
         [aux].value+=incremento;
         aux=[aux].next;
      END   
      [aux].value+=incremento;
      
      FRAME;
   END
END


//------------------------------------//
//Crea un timer nuevo
//------------------------------------//
FUNCTION MyTimer Timer_New()
PRIVATE
   TYPE_Timer POINTER aux;
BEGIN
   aux=timers;
   WHILE ([aux].next)
      aux=[aux].next;
   END   
   
   [aux].next=alloc(sizeof(TYPE_Timer));
   
   aux=[aux].next;
   [aux].value=0;
   [aux].next=NULL;
   
   RETURN &([aux].value);
END


//------------------------------------//
//Elimina un timer
//------------------------------------//
FUNCTION Timer_Delete(MyTimer Timer_Value)
PRIVATE
   TYPE_Timer POINTER aux;
   TYPE_Timer POINTER next;
BEGIN
   aux=timers;
   WHILE (&([[aux].next].value)!=Timer_Value)
      aux=[aux].next;
   END   
   
   //Guarda el dato que se pierde
   next=[[aux].next].next;
   
   //Libera memoria
   free([aux].next);
   
   //Restaura la cadena
   [aux].next=next;
END


//------------------------------------//
//Defines
//------------------------------------//
#DEFINE Timer_GetValue(a) [a]
[/code]


TEST:
[code language="bennu"]
PROGRAM timers
BEGIN
   Timers_Start();       //Inicia el controlador de los timers
   test();
END

PROCESS test()
PRIVATE
   MyTimer timer1;
BEGIN
   timer1=Timer_New();           //Crea el timer
   
   LOOP
      say(Timer_GetValue(timer1));     
      //Equivalente a:
      say([timer1]);
      FRAME;
   END
END
[/code]

Phreak

AHh me olvide... si le ven algun error o algo ke se pueda optimizar.. porfavor decidme XD
ahora si , chauss

l1nk3rn3l

le probare esta interesante

Windgate

Abro el sarcófago de la pirámide y lleno de polvo el foro al postear en este hilo. Me ha dado por echar un vistazo a los proyectos más antiguos, de cuando todavía no era 100% Bennusero y veo que este hilo aporta código interesante para la creación de tipos de datos dinámicos, también un buen uso de DEFINES, que tengo costumbre de no utilizar... Y debería... Tomo nota.

Lo dicho, disculpad el polvo pero espero que os sirva de inspiración echar un vistazo al módulo de Phreak, si vuelve a postear por aquí le daré un karma... Con más de 1 año de retraso :o
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es