PDA

Ver la Versión Completa : Problemas con Hebras


LIGERO
12-09-2012, 15:49:06
Buenas tardes amigos foreros:

Tengo un programa con una hebra que hace grabaciones en una base de datos sql server cada cuarto de hora y para ello utilizo la hebra.

Ver código.

unit Hebras;

interface

uses
Classes;

type
THebraCuartoHora = class(TThread)
grabar : boolean;
constructor Create; reintroduce; overload;
procedure Execute; override;

end;


var HebraCuartoHora : THebraCuartoHora;

implementation

uses DateUtils, sysutils, globales, BBDDCogeneracion, logging;


constructor THebraCuartoHora.Create;
begin
// llamamos al constructor del padre (TThread)
inherited Create(True);
grabar := true;

end;

procedure THebraCuartoHora.Execute;
var ahora: TdateTime;
minutos, segundos : integer;


begin
inherited;
while not TerminarPrograma do
begin
ahora := now;
minutos := MinuteOf(ahora);
segundos := SecondOf(ahora);
if ((minutos mod 15) = 0) and (segundos = 0) then
begin
// Incrementamos el contador de segundos y actualizamos la etiqueta
if (grabar = true) then
begin
grabar := false;
logger.log(elInfo,'::::::::::: Grabando Cuartos de Hora :::::::::::');
try
//InitializeCriticalSection(SeccionCritica);
GrabaCuartosHora(ahora);
//DeleteCriticalSection(SeccionCritica);
logger.log(elInfo,'::::::::::: Cuartos de Hora Grabados :::::::::::');
except
logger.log(elerror,'******** Error Grabando Cuartos de Hora ********');
grabar := true;
end;
end;
end
else
grabar := true;
end;
end;
end.

El problema es que la cpu se pone a 100% y baja bastante poco.

Qué puedo hacer.

WkaymQ48
12-09-2012, 16:44:33
Pues deberías dejar descansar a la CPU :)

Prueba con esto:

while not TerminarPrograma do
begin
Sleep(10); // <- Añadimos esta linea para decirle a windows que se lo tome con calma

LIGERO
13-09-2012, 01:36:28
Muchas gracias WKaymQ48. La verdad es que es una gran idea. De hecho le he puesto 100 en vez de 10 y por ahora funciona de coña. He intentado tambien con un temporizador que se ejecute cada minuto y cuando llegara el minuto 14, 29, 44 o 59 se ejecutara la hebra y durante un minuto a lo sumo se ejecuta y vuelve a paralizarla hasta que se vuelva a cumplir la condición, pero no ha resultado en tiempo de ejecución, aunque sí en tiempo de depuración. Curioso pero cierto.

Si alguien puede dar otra respuesta que considere buena, se aceptan

Muchas gracias

Delphius
13-09-2012, 04:17:57
¿Hebra? Como que le hemos pifiado... ¡Se les llama hilo! ¡HILO!

Saludos,