Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ejecutar selects en segundo plano (https://www.clubdelphi.com/foros/showthread.php?t=10725)

cartmanrules 27-05-2004 10:29:47

Ejecutar selects en segundo plano
 
Hola!

Me gustaría saber si alguien ha intentado ejecutar sentencias SQL usando hilos, para que corran en segundo plano. Con esto pretendo poder parar la ejecución si tarda mucho, y de paso hacer que el programa no se quede "colgado" esperando la respuesta del servidor... Con esto también surgen una serie de dudas:

- Si interrumpo una select, ¿el servidor lo aceptará bien? es decir, ¿no habrá problemas de estabilidad en la aplicación?
- Normalmente uso Interbase. Me imagino que sí, pero ¿es adecuado para lo que pretendo?

Bueno, si alguien lo ha hecho antes y quisiera compartir experiencias, componentes utilizados etc. le estaría muy agradecido :D

Un saludo.

__cadetill 27-05-2004 10:37:58

Cita:

Empezado por cartmanrules
- Si interrumpo una select, ¿el servidor lo aceptará bien? es decir, ¿no habrá problemas de estabilidad en la aplicación?

Yo lo probé hace ya algún tiempo con DB2 y la verdad es lo que me esperaba, si se interrumpe el hilo, él sigue con el SQL lanzado hasta que lo termina

Cita:

Empezado por cartmanrules
- Normalmente uso Interbase. Me imagino que sí, pero ¿es adecuado para lo que pretendo?

Pues no sabría decirte, no lo he probado nunca, pero yo tb me imagino que sí :D

mlara 27-05-2004 19:08:56

En sintonía con los hilos de ejecución... :cool:

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! :)


La franja horaria es GMT +2. Ahora son las 22:39:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi