2009-04-17 20 views
7

Estoy usando Delphi 2006 e Indy 10. Creo un formulario y agrego un componente IdHttpServer. Hago un evento OnCreate del formulario para establecer el servidor activo, y entro en estas líneas para OnCommandGet del servidor:Delphi/Indy IdHttpServer no multiproceso?

procedure TForm3.IdHTTPServerCommandGet(AContext: TIdContext; 
    ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 
begin 
    Beep; 
    Sleep(10000); 
    AResponseInfo.ContentText := DateTimeToStr(Now); 
end; 

Nota del sueño durante 10 segundos.

Luego pruebo con Firefox, usando 2 navegadores. Tengo el primero conectado a "localhost", y escucho un pitido enseguida. Luego, selecciono el segundo navegador y lo conecto a localhost (en menos de 10 segundos), pero no emite un pitido de inmediato. Espera a que se complete la primera solicitud, luego emite un pitido y espera otros 10 segundos.

Pensé que estos componentes eran de subprocesos múltiples? ¿Hay alguna propiedad que pueda configurar para que se comporte de la manera que pensé que sería (ambas solicitudes serían respondidas de inmediato).

+1

Puede comprobar si todo se está ejecutando en el mismo subproceso al devolver Formato ('% d% d', [MainThreadID, GetCurrentThreadID]) para el valor ContentText. Si es realmente multiproceso, los dos valores que obtenga en cada solicitud serán diferentes entre sí, y los segundos valores de ambas respuestas probablemente también sean diferentes. –

+0

Si pudiera interesarle una alternativa: comencé http://xxm.sourceforge.net/ para abrir un proyecto en el que estaba trabajando que podría resolver este y otros problemas similares. Todavía no lo probé en Delphi 2006, está basado en Delphi 7, pero con un poco de suerte debería funcionar. –

Respuesta

9

Not Indy y TIdHTTPServer son responsables de este comportamiento. ¡Es el navegador web!

Firefox comparte la conexión TCP para diferentes solicitudes en el mismo servidor.

Por lo tanto, Firefox serializa las 2 solicitudes para el mismo URI. Abra 2 navegadores diferentes al mismo tiempo (por ejemplo, IE y Firefox), solicite http://localhost/ en ambos y obtendrá el resultado esperado.

Y la respuesta a su pregunta: sí, por supuesto, cada evento TIdHTTPServer.OnCommandGet se ejecuta en un hilo "planificador" propio, y se puede ejecutar simultáneamente.

+2

Sí, eso es todo! Utilicé Firefox e Internet Explorer, y obtuve los resultados esperados, ¡muchas gracias! Hubo un error en mi código que mostraba el mismo comportamiento, así que cuando vi que Firefox lo hacía también supuse que mi código era perfecto ... –

0

He usado Indy 10 idHTTPServer y es multithread. ¿Qué bloqueo de su aplicación podría ser el comando "beep" o "sleep"? Porque, aunque el componente es multihilo, algunos comandos aún pueden bloquear todo el proceso.

+0

Por alguna razón, Indy está esperando que se complete la primera solicitud antes de que se active OnCommandGet para la segunda solicitud. Es como si hubiera envuelto el método OnCommandGet en una sección Crítica. Puede estar utilizando diferentes subprocesos para cada solicitud, pero eso no sirve de nada si Indy todavía los dispara en serie. Las funciones Beep y Sleep no bloquearán algún otro hilo. –

+0

Desde que desarrollé una aplicación completa con el componente, estoy bastante seguro de que es multithread. Si no va a ser un problema, publique su código y examinemos juntos para encontrar el problema;) – BYK

+1

Gracias, pruebe el código de este enlace, hágamelo saber lo que ve: http://www.benziegler.com/ cosas/IndyTest.zip –