Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-05-2004
cartmanrules cartmanrules is offline
Miembro
 
Registrado: may 2004
Posts: 16
Poder: 0
cartmanrules Va por buen camino
Question 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

Un saludo.
Responder Con Cita
  #2  
Antiguo 27-05-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
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í
Responder Con Cita
  #3  
Antiguo 27-05-2004
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Poder: 21
mlara Va por buen camino
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!
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.

Última edición por mlara fecha: 27-05-2004 a las 20:51:13.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 18:01:19.


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
Copyright 1996-2007 Club Delphi