![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
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 |
#3
|
|||
|
|||
lee la ayuda sobre TService
|
#4
|
||||
|
||||
![]() ![]() |
#5
|
||||
|
||||
je, je... seguramente ya lo solucionó
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#6
|
|||
|
|||
jejeje ... y ya ni me acuerdo como lo hice. De todas maneras gracias.
|
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Servicio | arantzal | Varios | 3 | 27-06-2007 10:50:55 |
Como puedo crear un servicio para monitorear BD | marcoev | Conexión con bases de datos | 2 | 12-09-2005 18:46:06 |
Crear Servicio WEB y publicarlo en TOMCAT | Khelma | Internet | 0 | 26-04-2005 13:11:21 |
Servicio NO-IP | StartKill | Varios | 1 | 29-03-2005 00:18:30 |
Servicio RAS | fabianmk | Internet | 0 | 11-11-2004 20:44:28 |
![]() |
|