FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
Cita:
Cita:
|
#3
|
||||
|
||||
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. 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. Código:
// Hilo de ejecución HiloEjecucion := THilo.Create; HiloEjecucion.OnTerminate := ProcedimientoParaHacerAlgo; Código:
var HiloEjecucion: THilo; 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 19:51:13. |
|
|
|