En sintonía con los hilos de ejecución...
1. Creas un nuevo hilo (File|New|Other|Thread)
Podrías ver en la nueva unidad algo como esto:
Código:
unit Unit1;
interface
uses
Classes;
type
ClaseHilo = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
procedure ClaseHilo.Execute;
begin
{ Place thread code here }
end;
end.
Podrías convertir este código en algo como esto:
Código:
unit Unit1;
interface
uses
Classes;
type
ClaseHilo = class(TThread)
private
AbortarHilo: Boolean;
protected
procedure Execute; override;
procedure EjecutarSQL; virtual; abstract;
public
constructor Create;
end;
THilo = class(ClaseHilo)
protected
procedure EjecutarSQL; override;
end;
implementation
uses
DataModuleUnit, Forms, Windows, SysUtils;
{ ClaseHilo }
constructor ClaseHilo.Create;
begin
AbortarHilo := False;
FreeOnTerminate := True;
inherited Create(False);
end;
procedure ClaseHilo.Execute;
begin
EjecutarSQL;
end;
{ THilo }
procedure THilo.EjecutarSQL;
begin
if AbortarHilo then
Exit;
try
with DataModule.IBStoredProcedure do begin
Transaction.StartTransaction;
ExecProc;
Transaction.Commit;
end;
except
Application.MessageBox('No se pudo ejecutar el procedimiento', 'Error',mb_Ok);
DataModule.IBStoredProcedure.Transaction.Rollback;
end;
end;
end.
2. Desde otra unidad, digamos en un evento OnClick de algún botón...
Código:
// Hilo de ejecución
HiloEjecucion := THilo.Create;
HiloEjecucion.OnTerminate := ProcedimientoParaHacerAlgo;
Previamente se debe haber declarado HiloEjecucion:
Código:
var
HiloEjecucion: THilo;
, y se debe haber incluído (en uses) la unidad Unit1.
Que si se puede interrumpir la ejecución de un procedimiento almacenado? Pues yo hasta ahora no he podido, pero el uso de Threads te garantiza que tu aplicación no se queda congelada mientras se ejecuta el código. Y para saber por dónde va la ejecución podrías usar una UDF para depurar, ya que con eventos hasta donde sé no es posible, porque estos se generan sólo cuando se hace un commit, cosa que no se puede hacer dentro de un procedimiento almacenado.
Obviamente las posibilidades son mayores. Recomiendo leer la documentación acerca de los hilos de ejecución. Delphi trae algunos ejemplos.
Mucha suerte!
