| '' |
Prueba de procesos múltiples
Alberto Rodriguez
Con VFP 6.0 Build 8167 los ejecutables que corren dentro de un mismo proceso (.DLL) no soportan ejecución simultanea de métodos. Para entendernos, como se comentó en el artículo Procesos y Threads de esta revista en Abril de 1999: “Asumamos que el Metodo1 ejecuta una consulta que dura 15 secgundos y el Método2 ejecuta una consulta que dura 1 segundo. Si el Método1 se invoca antes de que se invoque el Método2 la llamada al método2 bloqueará durante 15 segundos la respuesta a la otra instancia.” No obstante con VFP 6.0 Build 8492 (después de aplicar el SP.3) las cosas han cambiado. Ahora se dispone de una nueva órden que es:
BUILD MTDLL Para verlo visualmente nos podemos fijar en que la pantalla que controla los proyectos, al pulsar en el botón generar vemos:
Para hacer una prueba de su funcionamiento podemos hacer lo siguiente: 1.- Crea una clase tipo CUSTOM y especifícala como OLEPUBLIC y lláma DEMO al fichero contenedor de clases y a la clase llámala DemoTread. 2.- Crea un método que vamos a llamar ralentiza y escribe:
lparameters lnSegs LOCAL x lnSegs = IIF (EMPTY(lnSegs),0,lnSegs) DECLARE Sleep In Win32api INTEGER FOR x = 1 to lnSegs Sleep(1000) ENDFOR DECLARE INTEGER GetCurrentThreadId in Win32api return GetCurrentThreadId() Como sabes dentro de una DLL no podemos poner ‘situaciones de espera’ o interfaces: no se pueden usar formularios, messagebox, wait Windows o similar por eso utilizaremos una función del API de Windows que nos ralentiza nuestra consulta. 3.- Crea una página .ASP con el siguiente código:
<% lnSegs = Request("txtSegundos") IF LEN(lnSegs) < 1 Then lnSegs = "3" END IF lnSegs = CLng(lnSegs) Set oServer = Server.CreateObject("proy1.demotread") Response.Write("<B>Identificador del Thread</B>: " & oServer.ralentiza((lnSegs)) & "<br>") Response.Write("<B>Hora actual</B>" &FormatDateTime(now,vbLongTime)) %> <HR> <form method="post"action="lento.asp"> Esperando durante <input type="text" name=txtSegundos size = "3" value ="<%=lnSegs %>"> segundos <Input type="submit" value" Ejecutar de nuevo" name=button1> </form> 4.- Asegúrate de que tu explorador permite la ejecución de Treahds simultaneos. Esto lo puedes ver si está marcada la opción de: (en el IE 5.0) Herramientasa/Opciones de Internet/Opciones avanzadas Opción de Examinar/Iniciar ventanas del explorador en un nuevo proceso. 5.- Carga el Explorer y ejecuta la página ASP varias veces hasta tener algo parecido a la imagen. Como puedes ver estamos usando Threads diferentes y la respuesta de unos llega antes que otros para los distintos tiempos que marcamos. Puede ser que en alguna ocasión un thread quede libre y el explorer te muestre el mismo ID pero si está ocupado te mostrará otro ID. Ejecuta varios browsers lanzándolos de forma separada. No uses CTRL+N desde dentro de un Browser pues deben tener sesiones diferentes. Propiamente habría que utilizar Browsers diferentes.
Esta posibilidad de liberar los bloqueos no sólo se aplica a las Páginas Activas sino también al Microsoft Transaction Server pues ahora puedes tener el mismo objeto instanciado varias veces y con consultas simultaneas. Este Build resuelve un grave problema de escalabilidad que tenía VFP 6.0. El precio es: 1.- No puedes ya usar los viejos @GET, SAY, etc... 2.- Microsoft reconoce que el runtime del nuevo Build puede ser ligeramente más lento que el anterior pero con las nuevas máquinas que hay casi ni se nota.
|