|
|
|
|
- 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
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.). 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. | threadGlobalContext | Fuerza 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. | threadLightCopyHFSQLContext | 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. | threadNormal | Inicia el subproceso en modo normal. El contexto HFSQL se copia la primera vez que se utiliza una función HFSQL. | threadSecure | Inicia 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). | threadWaitForStart | Espera a que el subproceso inicie realmente antes de continuar con la ejecución. |
<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). 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. Observación: Los parámetros se pasan al procedimiento por valor y no por referencia. 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. 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.
|
Clasificación Lógica de negocio / UI: Código neutro
Esta página también está disponible para…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|