FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
ProcessMessage en un WebService
Necesito saber como puedo hacer algo como un Application.ProcessMessage en un WebService (CGI) del lado der servidor
Última edición por nicohug fecha: 20-10-2005 a las 19:48:16. |
#2
|
||||
|
||||
Que es lo que quieres hacer?
__________________
El malabarista. |
#3
|
||||
|
||||
Hola,
No sé yo si no sería mejor que implementaras el asunto en un "TThread", pero, es igual, tampoco sé si lo que diré ahora funcionará tampoco. Se trata de añadir la unidad "Forms" en donde precises hacer uso del método que refieres, pues este es de la clase "TApplication", la cual se define en dicha unidad. Bienvenido al ClubDelphi, por cierto. |
#4
|
||||
|
||||
Hola,
mamcx 1 - dec 0 |
#5
|
|||
|
|||
Gracias por la bienvenida
Bueno lo que necesito hacer es lo siguiente: en un servicio web implemento una funcion del lado del servidor que un punto lanzo x numero de hilos que realizan un trabajo en conjunto. La cuestion es que luego que lanzo los hilos debo esperar que todos terminen su trabajo y asi devolver el correspondiente resultado. En una aplicacion normal una forma de resolverlo es simplemente: lanzo los hilos y coloco un ciclo como el que sigue:
while not SeDetuvieronLosHilos do Application.processMessages; Siendo "SeDetuvieronLosHilos" una variable buleana global que cuando se terminan los hilos pasa a ser true. De esta forma tranco el metodo hasta que se terminen los hilos sin tildar la aplicacion. Ahora el problema es que, como bien alguien me respondio, el metodo "processMessages" es de la clase TApplication, y esa clase no esta cuando se esta haciendo una SoapApplication del lado del servidor, ya sea con CGI o ISAPI. La pregunta es: como consigo el mismo resultado, es decir esperar a que termine una serie de hilos lanzados, en un servicio web (del lado del server) |
#6
|
||||
|
||||
Hola,
Bueno. Veo que metí la pata por no leer convenientemente. Lo que yo leí (mal) fue algo que tuviera que ver con un Servicio de Windows, y no con un WebService, con los que además no tengo experiencia ninguna: con los primeros tengo poca, pero algo, al menos. No sé ahora qué responderte. Se me ocurre algo que creo que se planteó alguna vez en estos Foros como una posible solución: si estás empleando "TThread", creo que podrías valerte de los métodos de dicha clase; si no me equivoco cuentan con alguno que "te avisará" cuando se termine la ejecución de un Hilo en concreto. Así podría hacerse con los demás, supongo, esperando cooperar en algo, vaya. Aquí la descripción del método "Terminate" de la clase "TThread": Cita:
|
#7
|
|||
|
|||
Sigue
Ok gracias, si la clase ttherad tiene un puntero a metodo que se dispara cuando termina pero ese no es mi problema sino como hacer para que la aplicacion espere hasta que terminen los hilos, igual creo que voy a tener que usar otro lenguaje porque creo que no se puede (uso delphi 7)
|
#8
|
||||
|
||||
El problema que describes es generico, asi que cambiando de lenguaje no se va a a solucionar.
Se soluciona es con un entendimiento mas completo de lo que son threads: http://www.pergolesi.demon.co.uk/prog/threads/ToC.html http://delphi.about.com/od/kbthread/ http://www.midnightbeach.com/jon/pub.../MsgWaits.html Pero como aprenderas rapido, la programacion de threads es de locos. La verdad no se ha llegado a una solucione completamente clara pero si hay ya concenso en como hacer las cosas. La forma mas estable (la tradicional es usar WaitFor) es aprovecharse de las API de mensajes (asi como los que usan los controles de windows!). La idea es que se llama mensajes y un evento "escucha" cuando le llega el mensaje de que el thread X ya se completo, y espera a los otros. Es muy facil de programar. Pero en definitiva, mejor lee largo y tendido sobre el tema, para que veas la luz
__________________
El malabarista. |
#9
|
|||
|
|||
Gracias
Bueno muchisimas gracias por laa respuestas pero sigo pensando que el problema esta en la forma en que delphi implementa los servicios web, y no en los hilos en si, ya que lo que quiero hacer lo he hecho facilmente en una aplicacion normal y no me ha dado ningun problema. Bueno si por casualidad algien sabe como hacer andar el metodo DeleteFile en un Servicio Web (siempre el problemita esta del lado del servidor) y el metodo WinExec tambien se lo agradeceria (aclaro que estos metodos como a todos ustedes funcionan de maravilla en una plicacion normal, el drama como vengo diciendo, es cuando quiero implementar lo mismo con un servicio web).
Saludos y gracias |
#10
|
||||
|
||||
El problema no es de la implementacion de Delphi sobre servicios Web. Es simplemente que el desarrollo Web es fundamentalmente diferente de las aplicaciones normales. Y definitivamente, no existe razon en esta tierra de llamar a ProcessMessages.
Ademas, que WinExec es un API obsoleta y se debe usar CreateProcess, en fin... Entiende que un servicio web o pagina web YA esta dentro de un proceso y de un thread. Lo que quieres es llamar a procesos externos, y por default, no es asi de facil ya que el servicio web debe estar corriendo en una cuenta de usuario limitada (el usuario anonimo) lo que limita mucho lo que se puede hacer. Una solucion muy simple, seria crear un componente ActiveX, en el cual puedes programar de la forma local como estas acostumbrado, pero debes crearlo como EXE y darle los permisos respectivos. Con respecto a lo borrar archivos, no veo que problema puedas tener, excepto uno de seguridad o de concurrencia...
__________________
El malabarista. |
#11
|
|||
|
|||
Ok
Ok gracias voy a probar lo que me decis es cierto uno a veces se enoja con la herramienta y el problema muchas veces no es de ella sino que no la conoce bien, lo de eliminar archivos la verdad que me sigue llamando la atencion y suponia que debia ser como vos me decis un problema de seguridad, no sabes si eso se puede configurar o las limitaciones son inherentes al hech de trabajar con un servicio web?
|
#12
|
||||
|
||||
Si. Si el servicio web corre sobre IIS se le asigna por defecto el permiso de usuario anonimo, el cual, por obvias razones, no puede borrar archivos.
Una solucion es configurando el sitio web para que use autenticacion de windows, si es el caso que el servicio corre en una intranet.... de lo contrario toca impersonar la cuenta de usuario. Otra solucion es darle al usuario anonimo (NombreEquipo\ASPNET sobre Windows2000 y Windows XP o NT Authority\Servicio Red sobre Windows 2003 en español o NT Authority\Network Service sobre windows 2003 en ingles) permisos de modificacion sobre la carpeta del archivo. Es mejor que todo lo modificable quede en una carpeta <> root del sitio web asi es mas facil manejar la seguridad...
__________________
El malabarista. |
#13
|
|||
|
|||
Gracias
Ok gracias voy a ponerme a provar hoy todo lo que me has dicho, un abrazo grande y cualquier cosa vuelvo a escribir
|
|
|
|