114 lines
2.6 KiB
C++
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;
|
|
}
|
|
//**************************************************************************
|