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
  • Presentación
  • Gestión simple de subprocesos
  • Principio
  • Funciones de WLanguage
  • Características de un subproceso
  • Características de subprocesos
  • Atributos de extension relacionados con los hilos
  • Acceso a elementos existentes y contexto HFSQL
  • Recomendaciones para los procesos realizados por el subproceso
  • Procesos no permitidos
  • Procesos de una aplicación WINDEV
  • Proceso de excepción e subprocesos
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
Presentación
En tiempo de ejecución, una aplicación se ejecuta en un subproceso principal.
Esta aplicación puede iniciar un subproceso secundario en cualquier momento: esta Thread se ejecuta en paralelo con la aplicación. El subproceso corresponde a un procedimiento local o global de la aplicación.
El subproceso secundario se ejecuta en paralelo con la aplicación principal. Todos los procesos que se ejecutan en segundo plano se pueden realizar en este subproceso: recibir correos electrónicos, etc.
Observación: un subproceso eficiente espera un evento específico, por ejemplo, una acción del usuario, un correo electrónico entrante, una llamada telefónica entrante, etc.
Gestión simple de subprocesos

Principio

Para crear un subproceso secundario utilice la función ThreadExecute.
Un subproceso secundario se detiene automáticamente cuando:
  • el procedimiento que corresponde al subproceso ha finalizado,
  • el objeto que creó a el subproceso está cerrado.
Para forzar la interrupción:
  • del subproceso actual, utilice la función ThreadEnd.
Atención: Si se intenta detener un subproceso cuando se está ejecutando una función WLanguage, este se detendrá realmente cuando la función termine de ejecutarse.

Funciones de WLanguage

Las siguientes funciones permiten gestionar subprocesos:
ThreadCurrentDevuelve el nombre de el hilo actualmente en funcionamiento.
ThreadEndFinaliza la ejecución de la Thread actual.
ThreadExecuteInicia la ejecución de un subproceso secundario.
ThreadModeCambia el modo de gestión de los hilos.
ThreadPausePausa el subproceso actual por el tiempo especificado.
ThreadPriorityDevuelve o modifica el nivel de prioridad de un thread.
ThreadRequestStopEnvía una solicitud para detener un subproceso.
ThreadResumeReanuda la ejecución de una thread que fue interrumpida por thread Suspender. Función no recomendada.
ThreadStateDevuelve el estado actual de un thread.
ThreadStopDetiene un subproceso secundario. Función no recomendada.
ThreadStopRequestedVerifica si se ha enviado una solicitud al hilo que se está ejecutando.
ThreadSuspendSuspende temporalmente la ejecución de la Thread especificada. Función no recomendada.
ThreadWaitEspera a que finalice la ejecución del subproceso especificado.

Para más detalles, véase Funciones de gestión de subprocesos sobre todas las funciones utilizadas para gestionar los hilos.
Características de un subproceso

Características de subprocesos

En WLanguage, un subproceso secundario se puede asociar a:
  • un procedimiento local a la ventana actual,
  • un procedimiento global al proyecto,
  • un método de clase,
  • un método global de clase.
Una thread secundaria puede ser una segura thread. En este modo:
  • se producirá un error de compilación si se accede a los controles en el hilo (o si el Procedure utiliza el atributo "UI").
  • 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 ha desencadenado el hilo, se genera una petición de parada de el hilo (pero el hilo sigue ejecutándose después de cerrar la ventana).

Atributos de extension relacionados con los hilos

Al declarar un método de Procedure o de una clase, puede utilizar atributos de extensión para especificar las características de el hilo:
<Thread>Permite especificar que el Procedure se ejecute en un Thread secundario.
Este atributo de extensión no es compatible con <timer> y <main thread&gt.
<principal Thread>Se utiliza para especificar que el Procedure se ejecutará en el Thread principal.
Este atributo de extensión no es compatible con <timer> y <thread&gt.
<principal Thread asíncrono>Indica que la Procedure se ejecutará en el hilo principal y que no es necesario esperar al final de la ejecución de esta Procedure.
Este atributo de extensión no es compatible con <timer> y <thread&gt.
<seguro thread>Se utiliza para especificar que el Procedure se ejecutará en un Thread secundario seguro.
Este atributo de extensión no es compatible con <timer>, <main thread> y &ltUI&gt.
<contexto ligero de HFSQL>>.Activa 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.

Este atributo de extensión debe utilizarse con <Thread>.
Universal Windows 10 App Este atributo de extensión no está disponible.
<Contexto completo de HFSQL>>.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.

Este atributo de extensión debe utilizarse con <Thread>.
Universal Windows 10 App Este atributo de extensión no está disponible.

Observación: También puede utilizar la interfaz del editor de código, a través de Procedimientos automáticos.

Acceso a elementos existentes y contexto HFSQL

Al crear un subproceso, todas las declaraciones, objetos y elementos existentes son comunes:
  • al nuevo subproceso secundario.
  • al subproceso en el que se creó el subproceso secundario (el subproceso principal, en la mayoría de los casos).
Así, los subprocesos pueden acceder a las variables, procedimientos, etc., ... Si se crean variables una vez que se ha iniciado un subproceso, solo se puede acceder a ellas en el subproceso en el que se crearon.
De la misma manera, al crear un subproceso, el contexto HFSQL se duplica automáticamente. Cada subproceso manipula un contexto HFSQL específico. 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.
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.
Ejemplo:
Código Hilo 1Código Hilo 2
a=i
a++
i=a
b=i
b++
i=b

Estos dos subprocesos comparten las variables pero no gestionan el acceso a los recursos comunes. Si se ejecuta el subproceso 1 antes que el subproceso 2, el valor de i será 1 en lugar de 2.
Observación: Para compartir una asignación entre varios subprocesos, se deben utilizar los semáforos. Para obtener más información, consulte Gestionar los semáforos en subprocesos.
Recomendaciones para los procesos realizados por el subproceso

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.

Procesos de una aplicación WINDEV

De forma predeterminada, los eventos WINDEV (código de clic de un botón, por ejemplo), procedimientos y métodos de clase solo pueden ser ejecutados por un subproceso en un momento dado.
Para permitir que varios subprocesos ejecuten estos procesos al mismo tiempo, es necesario:
  1. Cambiar el modo de gestión predeterminado de los subprocesos (con la función ThreadMode).
  2. Gestionar las secciones críticas y los semáforos en el código de la aplicación.

Proceso de excepción e subprocesos

Si se realiza un proceso de excepción general en el código de inicialización del proyecto, se disparará si se produce una excepción:
  • en el subproceso principal,
  • en un subproceso secundario iniciado con la función ThreadExecute.
Sin embargo, si el subproceso secundario dispara una excepción, no se podrá conocer su origen con la función ExceptionInfo en el código del proyecto. Para conocer el origen de una excepción en un subproceso secundario, se debe incluir el proceso de la excepción en el subproceso secundario.
Versión mínima requerida
  • Versión 9
Esta página también está disponible para…
Comentarios
Haga clic en [Agregar] para publicar un comentario

Última modificación: 21/06/2023

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