Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   ProcessMessage en un WebService (https://www.clubdelphi.com/foros/showthread.php?t=26374)

nicohug 20-10-2005 18:43:48

ProcessMessage en un WebService
 
Necesito saber como puedo hacer algo como un Application.ProcessMessage en un WebService (CGI) del lado der servidor

mamcx 20-10-2005 18:50:33

Que es lo que quieres hacer?

dec 20-10-2005 18:51:45

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. :D

dec 20-10-2005 18:53:32

Hola,

mamcx 1 - dec 0

:D ;) :cool: :p :) ;) :D ;) :cool:

nicohug 20-10-2005 22:30:21

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)

dec 20-10-2005 23:43:15

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:

Empezado por Ayuda de Delphi
Signals the thread to terminate by setting the Terminated property to true.

Terminate sets the thread’s Terminated property to true, signaling that the thread should be terminated as soon as possible.

For Terminate to work, the thread's Execute method and any methods that Execute calls should check Terminated periodically and exit when it's true.

Unlike the Windows API TerminateThread, which forces the thread to terminate immediately, the Terminate method merely requests that the thread terminate. This allows the thread to perform any cleanup before it shuts down.


nicohug 21-10-2005 15:27:46

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)

mamcx 21-10-2005 16:02:27

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 ;)

nicohug 21-10-2005 23:51:55

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 :)

mamcx 22-10-2005 00:27:08

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...

nicohug 22-10-2005 19:44:40

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?

mamcx 24-10-2005 21:02:44

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...

nicohug 24-10-2005 22:36:12

Gracias
 
Ok gracias voy a ponerme a provar hoy todo lo que me has dicho, un abrazo grande y cualquier cosa vuelvo a escribir


La franja horaria es GMT +2. Ahora son las 22:33:51.

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