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 / WLanguage / Funciones WLanguage / Funciones estándar / Funciones de gestión de procesos / Hilos, semáforos, señales y mutex
  • Características de un subproceso creado en WLanguage
  • Hilos y HFSQL
  • Características del procedimiento WLanguage
  • Ciclo de vida de un subproceso
  • Gestión de errores
  • Procesos no permitidos
  • Detener un subproceso
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
Inicia la ejecución de un subproceso secundario. La sentencia es no bloqueante: los dos procesos se ejecutan en paralelo.
Recordatorio: Un subproceso es un proceso que se ejecuta en paralelo con la aplicación actual (subproceso principal). Esto le permite iniciar una tarea en segundo plano (hacer una copia de seguridad, etc.).
Ejemplo
ThreadExecute("Thread1", threadNormal, ThreadProcedure)
...
// Call to a global method of a class
ThreadExecute("Thread2", threadNormal, CClass::GlobalMethod)
// Run a thread while passing parameters
sDate is string
sDate = DateSys()
// Run the thread
ThreadExecute("THREADNAME", threadNormal, "pExecQry", sDate)
// Details of the "pExecQry" procedure
// This procedure expects a date as parameter of a query
PROCEDURE pExecQry(sDate)
IF HExecuteQuery(Del_Date, hQueryDefault, sDate) = False THEN
Error(HErrorInfo())
ELSE
HReadFirst(Del_Date)
END
Sintaxis

Ejecutar un subproceso asignándole un nombre (Sintaxis compatible) Ocultar los detalles

ThreadExecute(<Thread name> , <Options> , <WLanguage procedure> [, <Parameter 1> [... [, <Parameter N>]]])
<Thread name>: Cadena de caracteres
Nombre que se asignará al subproceso. Este nombre se utilizará en todas las funciones de gestión de subprocesos. No puede corresponder a una cadena vacía ("")
<Options>: Constante
Modo de inicio del subproceso.
threadFullCopyHFSQLContext
(Valor predeterminado)
Activa la copy inmediata del contexto HFSQL actual.
Se recomienda si el subproceso debe tener en cuenta las posiciones actuales en los archivos y consultas del contexto llamador.
Universal Windows 10 App Esta constante no está disponible.
threadGlobalContextFuerza el uso del contexto global del proyecto si el subproceso se ejecuta desde una ventana. El subproceso continuará ejecutándose hasta que se cierre la aplicación.
De forma predeterminada, se utiliza el contexto de la ventana, el subproceso se detiene al cerrarla.
Observación: Si se utiliza la función ThreadExecute en un código de inicialización global (proyecto, clase o conjunto), o desde cualquier procedimiento o método llamado desde un código de inicialización global, esta constante no tiene ningún efecto.
Universal Windows 10 App Esta constante no está disponible.
threadLightCopyHFSQLContextActiva la copy inmediata de una parte del contexto HFSQL actual.
Solo se almacenan los directorios que contienen los archivos de datos en modo HFSQL Classic y/o las conexiones en modo HFSQL Client/Server.
Universal Windows 10 App Esta constante no está disponible.
threadNormalInicia el subproceso en modo normal. El contexto HFSQL se copia la primera vez que se utiliza una función HFSQL.
threadSecureInicia una thread en modo seguro. En este modo, se lanzará una excepción:
  • si el hilo accede a los controles en tiempo de ejecución,
  • si se llama a la función ThreadStop.
Cuando se cierra la ventana que activó el hilo, se genera una petición de parada de el hilo (pero el hilo sigue funcionando después de cerrar la ventana).
threadWaitForStartEspera a que el subproceso inicie realmente antes de continuar con la ejecución.
Universal Windows 10 AppAndroidWidget Android Java Esta constante no está disponible.
<WLanguage procedure>: Nombre de Procedure
Nombre del procedimiento WLanguage ejecutado. Este procedimiento se ejecuta en paralelo con la aplicación.
<Parameter 1>: Opcional
Parámetros que se pasarán al procedimiento. Atención: estos parámetros se pasan por valor (no por referencia).
<Parameter N>: Opcional
Parámetros que se pasarán al procedimiento. Atención: estos parámetros se pasan por valor (no por referencia).
WINDEVWEBDEV - Código ServidorUniversal Windows 10 AppiPhone/iPadIOS WidgetApple Watch

Declarar y ejecutar una variable de tipo Thread Ocultar los detalles

<Result> = ThreadExecute(<WLanguage procedure> [, <Parameter 1> [... [, <Parameter N>]]] [, <Options>])
<Result>: Variable de tipo Thread
Variable de tipo Thread que corresponde al subproceso ejecutado.
<WLanguage procedure>: Nombre de Procedure
Nombre del procedimiento WLanguage ejecutado. Este procedimiento se ejecuta en paralelo con la aplicación.
<Parameter 1>: Opcional
Parámetros que se pasarán al procedimiento. Atención: estos parámetros se pasan por valor (no por referencia).
<Parameter N>: Opcional
Parámetros que se pasarán al procedimiento. Atención: estos parámetros se pasan por valor (no por referencia).
<Options>: Constante opcional
Modo de inicio del subproceso.
threadFullCopyHFSQLContext
(Valor predeterminado)
Activa la copy inmediata del contexto HFSQL actual.
Se recomienda si el subproceso debe tener en cuenta las posiciones actuales en los archivos y consultas del contexto llamador.
Universal Windows 10 App Esta constante no está disponible.
threadGlobalContextFuerza el uso del contexto global del proyecto si el subproceso se ejecuta desde una ventana. El subproceso continuará ejecutándose hasta que se cierre la aplicación.
De forma predeterminada, se utiliza el contexto de la ventana, el subproceso se detiene al cerrarla.
Observación: Si se utiliza la función ThreadExecute en un código de inicialización global (proyecto, clase o conjunto), o desde cualquier procedimiento o método llamado desde un código de inicialización global, esta constante no tiene ningún efecto.
Universal Windows 10 App Esta constante no está disponible.
threadLightCopyHFSQLContextActiva la copy inmediata de una parte del contexto HFSQL actual.
Solo se almacenan los directorios que contienen los archivos de datos en modo HFSQL Classic y/o las conexiones en modo HFSQL Client/Server.
Universal Windows 10 App Esta constante no está disponible.
threadNormalInicia el subproceso en modo normal. El contexto HFSQL se copia la primera vez que se utiliza una función HFSQL.
threadSecureInicia una thread en modo seguro. En este modo, se lanzará una excepción:
  • si el hilo accede a los controles en tiempo de ejecución,
  • si se llama a la función ThreadStop.
Cuando se cierra la ventana que activó el hilo, se genera una petición de parada de el hilo (pero el hilo sigue funcionando después de cerrar la ventana).
threadWaitForStartEspera a que el subproceso inicie realmente antes de continuar con la ejecución.
Universal Windows 10 App Esta constante no está disponible.
WINDEVWEBDEV - Código ServidorUniversal Windows 10 AppiPhone/iPadIOS WidgetApple Watch

Ejecutar un subproceso ya descrito (variable de tipo Thread) Ocultar los detalles

<Result> = ThreadExecute(<Thread>)
<Result>: Variable de tipo Thread
Variable de tipo Thread que corresponde al subproceso ejecutado.
<Thread>: Variable de tipo Thread
Nombre de la variable de tipo Thread que corresponde al subproceso que se ejecutará.
Atención: Si ya se está ejecutando el subproceso o ya ha sido ejecutado, se producirá un error WLanguage.
Observaciones

Características de un subproceso creado en WLanguage

Un subproceso creado en WLanguage solo puede ser un procedimiento o un método de clase. El subproceso no puede corresponder a un proceso WLanguage (código de un control, por ejemplo).
Si el subproceso es un método de clase, la función ThreadExecute debe ejecutarse desde uno de los procesos de la clase (constructor o método).

Hilos y HFSQL

Los contextos HFSQL se duplican automáticamente cuando se ejecuta ThreadExecute: el número de contextos HFSQL es igual al número de subprocesos que se ejecutan. Todo el contexto HFSQL (filtro, condición de búsqueda, etc.) se copia. El contexto HFSQL evoluciona de forma independiente en cada subproceso.
Esto le permite navegar por un mismo archivo de datos en dos subprocesos diferentes.
Existen dos métodos para copiar contextos HFSQL:
  • Copia completa del contexto (predeterminada)
  • Copia ligera del contexto.
Para obtener más información sobre cómo se copian los contextos HFSQL y sus límites (según la base de datos), consulte Gestión de contextos HFSQL.
Ejemplo:
  • Se crea un filtro en el archivo de datos Customer.
  • Se llama a ThreadExecute para crear el CTX2 thread.
  • En cada subproceso (principal y CTX2) se filtra el archivo de datos Customer. Si se desactiva el filtro en el subproceso principal, el filtro seguirá activo en el subproceso CTX2.
Casos especiales:
  • Gestión asistida de errores HFSQL: Si se utilizan varios subprocesos en los archivos de datos, se recomienda personalizar la gestión de errores HFSQL para que no se muestren las ventanas predeterminadas. Utilice la función HOnError para desactivar la gestión automática de errores o para redirigir la gestión de errores a un procedimiento personalizado (sin mostrar ventanas). Para obtener más información, consulte Gestión asistida de errores HFSQL.
  • Escritura y asignaciones en un subproceso: Si los valores se escriben o se asignan en un Thread, los demás Thread en funcionamiento no comparten esta información. Se pueden producir algunas inconsistencias.

Características del procedimiento WLanguage

Atención: Al llamar a las funciones Info, Error, etc., ... se bloquean todos los subprocesos que se están ejecutando.
Universal Windows 10 AppAndroidWidget Android Java Al llamar a las funciones Info, Error, etc., ... no se bloquean los subprocesos que se están ejecutando.
Observación: Los parámetros se pasan al procedimiento por valor y no por referencia.
WINDEV Para obtener más información sobre la apertura de ventanas en subprocesos secundarios, consulte Abrir una ventana en una thread secundaria.

Ciclo de vida de un subproceso

El subproceso se detiene automáticamente al final de la ejecución del WLanguage Procedure iniciado por ThreadExecute.
Un subproceso también se detiene en los siguientes casos:
  • si se llama ThreadExecute desde el código de una ventana, el hilo se detendrá cuando se cierre la ventana.
  • si se llama a ThreadExecute desde un Process global (inicialización, llamada explícita en el contexto principal), el hilo se detendrá cuando el la aplicación se termina.
  • si se llama a ThreadExecute en un método de clase, el hilo se detiene cuando se destruye el objeto.
Para forzar la ejecución de un subproceso en el contexto principal, utilice la constante threadGlobalContext.
Para forzar la interrupción de un subproceso, utilice la función ThreadStop. Esta función se puede utilizar para detener un subproceso desde el subproceso principal.
Observación: Se recomienda comprobar que los subprocesos se han detenido correctamente (con las funciones ThreadState o ThreadWait) antes de cerrar las ventanas o destruir los objetos.

Gestión de errores

Un error fatal ocurre en los siguientes casos:
  • si el procedimiento no existe.
  • si se está ejecutando un subproceso con el mismo nombre.

Procesos no permitidos

Atención: Los siguientes procesos no se pueden ejecutar en los subprocesos:
Atención: Los elementos de la interfaz de usuario (ventanas, controles, etc.) no pueden ser manipulados en un Thread.secundario
Cuando un Thread secundario debe interactuar con el usuario o actualizar la UI, debe utilizar un Process iniciado desde el Thread principal. Este proceso puede corresponder a:
  • un procedimiento global del proyecto o un procedimiento local (de una ventana, etc.) llamado con la función ExecuteMainThread,
  • el evento "Solicitud para actualizar la visualización" de una ventana, ejecutado con la función RequestRefreshUI.
AndroidWidget Android

Detener un subproceso

En Android, la función ThreadStop no está disponible.
Solo el hilo debe detener el hilo, al final del procedimiento WLanguage llamado por ThreadExecute .
Ejemplo:
ThreadExecute("th", threadNormal, ProcThread)
PROCEDURE ProcThread
bThreadAlive is boolean = True
WHILE bThreadAlive

// ... Process

// Test the end condition of the thread
IF <THREAD END CONDITION> THEN
bThreadAlive = False
END
END
Clasificación Lógica de negocio / UI: Código neutro
Componente: wd290vm.dll
Versión mínima requerida
  • Versión 9
Esta página también está disponible para…
Comentarios
Video threadExecute
https://youtu.be/IThk-OAzffA

https://windevdesenvolvimento.blogspot.com/2019/01/dicas-1996-windev-threads-02.html
amarildo
24 01 2019

Última modificación: 22/06/2023

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