PDA

Ver la Versión Completa : Como Liberar un Tthread????


AGAG4
23-04-2005, 02:29:53
Aqui ando de nuevo, alguien sabe como liberar un Hilo????, lo creo de la siguiente manera:

//Declaracion en unidad aparte
TPeticion = class(TThread)
private
AvancePeti:Integer;
lEstatus:String;
protected
procedure Proceso;
procedure Execute; override;
end;

procedure TPeticion.Proceso;
begin
....
....
Transaccion.Commit;//Aqui se Cuelga la Aplicación
end;

procedure TPeticion.Execute;
begin
FreeOnTerminate:=true;
Proceso;//Llamar Proceso
end;
....
{En una Aplicación Creo el Hilo de la Siguiente Manera, para llamar el:
procedimiento PROCESO que esta dentro del Hilo}
procedure IniciaProceso ;
....
THiloPet:=TPeticion.Create(False);
....
end;


Pero cuando el Compilador llega a la línea de Commit dentro del procedimiendo "PROCESO" se CUELGA la Aplicación.....

No permiten en los hilos hacer procesos de Base de Datos, bien los componentes IBX no son recomendados en el uso de Hilos????

Agradezco cualquier sugerencia.

Al González
24-04-2005, 22:52:23
¡Buen día a todos!

Alfredo:

Que yo sepa no existe conflicto alguno entre los componentes IBX y el uso de hilos alternos. Aunque ciertamente me gustaría hacer algunas observaciones:

Cuando dices que el compilador se detiene, me parece que en realidad te refieres al depurador (al estar ejecutando el programa que ya fue compilado).

Bien, en estos casos es recomendable sincronizar el hilo alterno, para evitar conflictos de memoria:

Procedure TPeticion.Execute;
Begin
...
{ Llamar al método Proceso de forma sincronizada con el hilo
principal }
Synchronize (Proceso);
...
end;


Por otra parte, si lo que deseas es que cada cierto tiempo se comentan (commit) a la base de datos los cambios pendientes, te sugiero establecer un valor de 250 milisegundos en la propiedad Transaccion.IdleTimer y un valor de taCommitRetaining en la propiedad Transaccion.DefaultAction (establecimientos que se pueden realizar con el inspector de objetos).

Si de todas formas necesitas crear un hilo alterno, puedo sugerirte que consideres utilizar la clase TghThread como lo explico en el tema Timers (http://www.clubdelphi.com/foros/showthread.php?t=20123). Te ahorra mucho del trabajo sucio que implica montar correctamente un hilo de ejecución alterno.

Espero esto sea de utilidad, seguimos en contacto.

Al González. :)

AGAG4
25-04-2005, 17:05:40
Muchas Gracias Al González, por sus consejos, los voy aplicar, es sólo que quería estar informado de porque al llegar al Commit se me queda colgada la aplicación.

Que tenga Buen día. ...

AGAG4
25-04-2005, 22:16:40
Ya lo Probe como me comento añadiendo el Synchronize al PROCESO,

Procedure TPeticion.Execute;
Begin
...
{ Llamar al método Proceso de forma sincronizada con el hilo principal }
Synchronize (Proceso);
...
end;

pero de todas formas se CUELGA al llegar al Commit.Y respecto a lo otro, no ocupo hacer Commit's cada cierto tiempo, lo que tengo es, que cada vez de que se active en FireBird un Evento(IbEvent) en cierta Tabla, se crea el HILO....

Agradezco su respuesta.