utiles_v2017/cola_asincrona.cpp

114 lines
2.6 KiB
C++

#include "StdAfx.h"
#include "cola_asincrona.h"
//**************************************************************************
Ccola_asincrona::Ccola_asincrona(void)
{
strcpy(nombre, "Cola asincrona sin nombre");
time_sleep=20;
m_thread=NULL;
timers=NULL;
pirate=FALSE;
n_timers=max_timers=0;
ultima_tarea=FALSE;
tipo_u_tarea=0;
}
//**************************************************************************
Ccola_asincrona::~Ccola_asincrona(void)
{
termina();
if (timers)
{
free(timers);
}
}
//**************************************************************************
void Ccola_asincrona::procesa(int tipo, BYTE* e )
{
}
//**************************************************************************
void Ccola_asincrona::inicia( int size,int cap )
{
tareas.inicia(cap,size+sizeof(int));
}
//**************************************************************************
BOOL Ccola_asincrona::add(int tipo,BYTE*e )
{
return tareas.add(tipo,e);
}
//**************************************************************************
void Ccola_asincrona::rum()
{
BYTE *tarea;
BYTE *contenido;
int *tipo;
Timers_cola_asincrona *tim;
while(!pirate)
{
//miramos si hay tarea--------------------------
t=_time64(NULL);
for (int i=0; i<n_timers; i++)
{
tim=&timers[i];
if (tim->t+tim->ultimo<=t)
{
tim->ultimo=t;
procesa(tim->tipo,NULL);
}
}
tarea=tareas.get();
if (tarea)
{
tipo=(int*)tarea;
contenido=&tarea[sizeof(int)];
procesa(*tipo,contenido);
}
else
Sleep(time_sleep);
}
if (ultima_tarea)
procesa(tipo_u_tarea,NULL);
}
//**************************************************************************
void Ccola_asincrona::cuida()
{
if (max_timers<=n_timers+1)
{
max_timers+=10;
if (timers)
{
timers=(Timers_cola_asincrona*)realloc(timers,max_timers*sizeof(Timers_cola_asincrona));
}
else
{
timers=(Timers_cola_asincrona*)malloc(max_timers*sizeof(Timers_cola_asincrona));
}
}
}
//**************************************************************************
void Ccola_asincrona::on_timer( int t,int tipo )
{
cuida();
Timers_cola_asincrona *tim=&timers[n_timers];
//Timers_cola_asincrona *tim=&timers[n_timers*sizeof(Timers_cola_asincrona)];
tim->t=t;
tim->tipo=tipo;
tim->ultimo= _time64(NULL);
n_timers++;
}
//**************************************************************************
void Ccola_asincrona::termina()
{
pirate=TRUE;
join();
}
//**************************************************************************
void Ccola_asincrona::add_fin( int tipo )
{
ultima_tarea=TRUE;
tipo_u_tarea=tipo;
}
//**************************************************************************