Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Crear un servicio (https://www.clubdelphi.com/foros/showthread.php?t=31852)

Aldo 19-05-2006 18:24:38

Crear un servicio
 
Hola a todos:

Estoy trabajando con Delphi 5 y tengo un servicio creado para realizar una serie de tareas automáticamente según la hora a la que están programadas para que se ejecuten.

Bien lo importante es que tengo otra aplicación que es un manager del servicio y desde la que puedo enviar códigos de control para que el servicio sea capaz de ejecutar. Ej: Detenerse, Iniciarse, etc. Pero lo que me lleva ahora mismo a un quebradero de cabeza es la de hacer que se ejecute una de las tareas específicas de todas las que están programadas.

Esto lo hago de dos formas
1 - Le envío un código de control de ejecución de tareas y el servicio al muestra una ventana con todas las tareas programadas y el usuario final puede seleccionar la tarea que desee ejecutar en ese momento y una vez seleccionada, el servicio la ejecuta en ese momento y no esperando a la hora que tenga programada.
2 - La segunda forma es tratar de ejecutar lo mismo pero de forma silenciosa. O sea que la aplicación Manager le debe enviar un código de control al servicio para decirle que debe ejecutar una tarea XXX, pero no encuentro como decirle que la tarea que se debe ejecutar es la llamada XXX y no la YYY o ZZZ, etc. ( NOTA IMPORTANTE: Las tareas no son nada fijo, ni prestableciso, el usuario del manager puede crear las tareas que quiera, por lo que no podría tener de antemano predefinido un código de control para cada una de las posibles tareas, porque no se saben cuantas se crearán ).

Se me había ocurrido trabajar con Átomos Globales o una cosa por el estilo, pensando que el Servicio tenía algún procedimiento para el manejo de Mensajes, pero veo que no lo tiene y no sé como seguir. Después investigando vi que los servicios tienen una propiedad pública que se llama ServiceThread y ésta tiene un método que se llama ProcessRequests que es muy parecido a los procedimiento de manejos de mensajes de windows. Pensé en coger la dirección del método, almacenarla en una variable y redireccionar ese método a uno mío que haga lo que yo quiero, que es verificar si ha llegado el código de control que dice que se debe ejecutar la Tarea XXX y leer de los Átomos Globales el nombre de la tarea que se debe ejecutar y después que se siga ejecutando el método como estaba programado antes porque en este caso lo que haría sería invocar la variable en la que lo tengo programado. Sería algo así

Crear un Tipo en la unit
TProcessRequests = procedure (WaitForMessage: Boolean) of Object;

Esto sería en la declaración Private del Servicio
FProcessRequests : TProcessRequests;
FszAtomName : String;

Esto iría en el ServiceStart
FProcessRequests := ServiceThread.ProcessRequests;
ServiceThread.ProcessRequests := ProcessRequestsService; // OJO: Esto es lo que no sé hacer y falla cuando se compila.

Esta sería mi procedimiento ProcessRequestService

procedure TServicioGDBMant.ProcessRequestsService(WaitForMessage: Boolean);
var
msg : TMsg;
PStr : PChar;
begin
GetMessage(msg, 0, 0, 0);

if msg.message = PRUEBA_CODIGO_CONTROL_EJECUTAR_TAREA_X then
begin
PStr := StrAlloc( 256 );
try
GlobalGetAtomName( Msg.WParam, PStr, 256 );
FszAtomName := String( PStr );
ShowMessage( FszAtomName );
finally
StrDispose( PStr );
end;
end;

if Assigned( FProcessRequests ) then
FProcessRequests( WaitForMessage );
end;




El tema es que logro guardar el método en la variable, pero no logro redireccionar ese método a un nuevo procedure que he hecho yo para que esto funcione como yo había explicado antes.

Lo ideal hubiera sido heredar un nuevo componente TServiceThread y sobrescribir el método en cuestión y todo solucionado, pero es que esto es una propiedad del TService y no sé como hacerlo.

¿Se os ocurre otra idea?. Igual me estoy liando y la solución la tengo delante de mis narices, pero no la veo, estoy obcecado. O talvez eso que quiero hacer no se puede.

Os agradecería que alguien me de un norte de como hacer eso que quiero. Muchas gracias por el tiempo prestado.

toni_lp 06-07-2006 17:43:48

No es respuesta, es pregunta
 
Disculpá que te moleste con esto, pero veo que tenés bastante claro el tema de servicios.
Estoy intentando empezar a programar un servicio y necesitaría que me des los lineamientos básicos y cosas a tener en cuenta para ponerlo en funcionamiento.
Desde ya muchas gracias

fide 28-02-2008 23:46:58

lee la ayuda sobre TService

cHackAll 04-03-2008 16:15:52

Cita:

Empezado por fide (Mensaje 269557)
lee la ayuda sobre TService

:eek: Vaya fide, creo que no te has fijado la fecha del último post :p

Casimiro Notevi 04-03-2008 17:03:29

Cita:

Empezado por cHackAll (Mensaje 270519)
:eek: Vaya fide, creo que no te has fijado la fecha del último post :p

je, je... seguramente ya lo solucionó :D

toni_lp 04-03-2008 17:21:40

jejeje ... y ya ni me acuerdo como lo hice. De todas maneras gracias.


La franja horaria es GMT +2. Ahora son las 00:58:56.

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