AYUDA EN LÍNEA
 WINDEVWEBDEV Y WINDEV MOBILE

Este contenido se ha traducido automáticamente.  Haga clic aquí  para ver la versión en inglés.
Ayuda / Desarrollar una aplicación o un sitio web / Controles, ventanas y páginas / Página / Programación
  • Presentación
  • Principio
  • Implementación
  • Ejemplo
  • Tareas paralelas para ejecutar la larga Process
  • Llamando a RequestRefreshUI
  • Evento "Solicitud para actualizar la visualización"
  • Navegador timer
  • Desactivación de la timer
  • Enfoque alternativo
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaReportes y ConsultasCódigo de Usuario (UMC)
WEBDEV
WindowsLinuxPHPWEBDEV - Código Navegador
WINDEV Mobile
AndroidWidget Android iPhone/iPadIOS WidgetApple WatchMac CatalystUniversal Windows 10 App
Otros
Procedimientos almacenados
Page en modo Sesión: Poblar los controles después de una larga Process
Presentación
En una aplicación web, puede ser necesario ejecutar procesos largos (por ejemplo, para actualizar contadores en una cuadro de mando). En esta página se explica cómo ejecutar estos procesos:
  • sin bloquear la interfaz de usuario,
  • actualizando automáticamente los datos mostrados cuando se dispone de nuevos valores.
Principio
Para rellenar los controles con los resultados de procesos largos sin bloquear el navegador, existe una solución fiable y relativamente sencilla:
  1. Utilice hilos seguros o tareas paralelas para preparar los resultados en variables globales,
  2. Llamar a la función RequestRefreshUI de WLanguage desde los hilos o tareas paralelas cuando los resultados estén disponibles,
  3. Escriba el código para actualizar los controles en la "Solicitud de refresco de la pantalla" Event,
  4. Configura un temporizador en el navegador que llame a un servidor asíncrono AJAX Procedure para actualizar los controles y actualización el UI cada 10 segundos o cada minuto, por ejemplo,
  5. Active/desactive la timer según sea necesario para evitar llamadas AJAX innecesarias.
Implementación

Ejemplo

Utilicemos el siguiente ejemplo para repasar los diferentes pasos:
  • una página que contenga una control Cuadro de mando
  • Los nuevos valores del contador se calculan en un Procedure local denominado UpdateKIP .
  • el código que inicia la actualización cuadro de mando está escrito en "Actualización (asincrónica)" control Botón .

Tareas paralelas para ejecutar la larga Process

En el código del servidor control Botón se inicia la ejecución del UpdateKIP Procedure en una tarea paralela. Esto significa que la UI no se bloquea y sigue respondiendo.. Por ejemplo:
gUpdateParallelTask is ParallelTask
gUpdateParallelTask  = ParallelTaskExecute(UpdateKIP, ())
En este código, un reference para la tarea paralela se almacena en el Variable global de gUpdateParallelTask..
Para evitar lanzar varias tareas de recálculo al mismo tiempo, el código control Botón comprueba la propiedad State del ParallelTask Variable.
IF gUpdateParallelTask.State = ptsExecutionInProgress
ToastDisplay("Request already in progress", toastShort, vaTop, haCenter, PastelGreen)
ELSE
gUpdateParallelTask  = ParallelTaskExecute(UpdateKIP, ())
END
En el código del navegador control Botón , también se inicia un temporizador cada segundo para ejecutar un navegador Procedure (llamémoslo Update_Browser).
gnUpdateTimer = Timer(Update_Browser, 1 s)
Observación: En este ejemplo, el temporizador Procedure es llamado cada segundo. Puede que no sea necesario ejecutar el temporizador Procedure tan a menudo. Siéntase libre de ajustar la frecuencia de actualización.

Llamando a RequestRefreshUI

El código del UpdateKIP Procedure recalcula los contadores en el cuadro de mando. Cuando las variables del servidor que son globales para la página están actualizadas, UpdateKIP Procedure llama a RequestRefreshUI.
Esta función permite a WLanguage ejecutar la "Solicitud de refresco de la pantalla" Event lo antes posible.
La Procedure finaliza, dando por terminada la tarea paralela.
La propiedad State de la tarea paralela se establece en ptsCompleted .

Evento "Solicitud para actualizar la visualización"

La "Solicitud de actualización de la pantalla" Event contiene el código que actualiza los controles.
En nuestro ejemplo:
LOOP_KIP[gnDailyTurnoverRow].ATT_KIPName = StringBuild(gsDailyTurnover, gnDailyTurnover)
LOOP_KIP[gnNumberOrdersRow].ATT_KIPName = StringBuild(gsNumberOrders, gnOrders)

Navegador timer

Durante este tiempo, el navegador Timer( Update_Browser Procedure en nuestro ejemplo) ejecuta regularmente el servidor Update_Server Procedure 06500.
Esta Procedure se ejecuta mediante una llamada AJAX asíncrona. De nuevo, el propósito es evitar el bloqueo del UI.
AJAXExecuteAsynchronous se llama especificando ajaxUpdateControls constante.
AJAXExecuteAsynchronous(ajaxUpdateControls + ajaxSynchronizeServerVariables, ...
Update_Server, AfterUpdate_Browser)
Esta constante permite que el código del servidor actualice los controles de Page. La llamada al servidor actualizará automáticamente el UI. Update_Server Procedure devuelve solo el valor de gUpdateParallelTask.State.
AJAXExecuteAsynchronous llama automáticamente a un navegador Procedure cuando se recibe la respuesta del servidor. En el ejemplo, es AfterUpdate_Browser Procedure .

Desactivación de la timer

AfterUpdate_Browser toma los siguientes parámetros:
  • el valor devuelto por el servidor Procedure , aquí gUpdateParalleTask.State. Por lo tanto, si se completa la tarea paralela ( ptsCompleted constante), timer se detiene para evitar llamadas innecesarias al servidor.
  • un identificador para el servidor correspondiente Procedure. Este identificador puede ser muy útil si hay varias llamadas AJAX simultáneas.
PROCÉDURE AfterUpdate_Browser(sTaskStatus is string, nIdentifier is int)

Enfoque alternativo

Si el Process tarda mucho tiempo y requiere una cantidad significativa de recursos por parte del servidor, puede que merezca la pena trasladar el Process a otro lugar.
En ese caso, basta con utilizar una tarea programada WEBDEV para realizar la Process larga a intervalos regulares y almacenar los resultados en la base de datos. El sitio sólo tendrá que mostrar los resultados almacenados.
Para obtener más información, consulte : WEBDEV: Tareas programadas y tareas retrasadas
Ver también
Versión mínima requerida
  • Versión 28
Comentarios
Haga clic en [Agregar] para publicar un comentario

Última modificación: 12/09/2023

Señalar un error o enviar una sugerencia | Ayuda local