HIX Cron/Task Testing - Walkthrough
Objetivo
Crear y probar ejemplos completos de la nueva funcionalidad de gestión de tareas (cron) de HIX, que permite ejecutar threads de Harbour en segundo plano.
Archivos Creados
He creado 6 archivos de prueba en c:\hix para demostrar diferentes capacidades de la funcionalidad de tareas:
1. [test_init.prg](file:///c:/hix/test_init.prg) 
Propósito: Ejemplo básico - Reloj que muestra la hora cada segundo
URL: http://localhost/task/test_init.prg
Código:
Code: Select all | Expand
function main()
? 'Init Thread Task: ', HIX_AddTask( 'TIME', hb_threadStart( @zTime() ) )
retu nil
function zTime()
while .t.
_d( time() )
hb_idleSleep(1)
end
retu nilQué hace:
- Inicia una tarea llamada 'TIME'
- Muestra la hora actual cada segundo
- Perfecto para verificar que la funcionalidad básica funciona
2. [test_counter.prg](file:///c:/hix/test_counter.prg) 
Propósito: Contador incremental que demuestra persistencia de variables
URL: http://localhost/task/test_counter.prg
Características:
- Contador que incrementa cada 2 segundos
- Muestra cómo mantener estado en un thread
- Útil para verificar que las variables persisten
3. [test_logger.prg](file:///c:/hix/test_logger.prg) 
Propósito: Sistema de logging con timestamps
URL: http://localhost/task/test_logger.prg
Características:
- Escribe logs cada 5 segundos
- Archivo de salida:
.log\task_logger.txt - Incluye fecha y hora en cada entrada
- Demuestra I/O de archivos desde threads
4. [test_multiple.prg](file:///c:/hix/test_multiple.prg) 
Propósito: Múltiples tareas concurrentes
URL: http://localhost/task/test_multiple.prg
Tareas que inicia:
- RELOJ: Hora cada segundo
- STATS: Estadísticas del sistema cada 10 segundos
- HEARTBEAT: Señal de vida cada 3 segundos
Código relevante:
Code: Select all | Expand
HIX_AddTask( 'RELOJ', hb_threadStart( @zClock() ) )
HIX_AddTask( 'STATS', hb_threadStart( @zStats() ) )
HIX_AddTask( 'HEARTBEAT', hb_threadStart( @zHeartBeat() ) )Qué demuestra:
- Ejecución paralela de múltiples threads
- Diferentes intervalos de ejecución
- Monitoreo concurrente
5. [test_status.prg](file:///c:/hix/test_status.prg) 
Propósito: Monitor de estado de tareas (placeholder)
URL: http://localhost/task/test_status.prg
Nota: Este archivo es un esqueleto para futuras implementaciones que requieren funciones adicionales como:
HIX_GetTasks()- Para listar tareas activasHIX_GetTaskStatus()- Para obtener estado de una tareaHIX_ListTasks()- Para enumerar todas las tareas
6. [test_scheduled.prg](file:///c:/hix/test_scheduled.prg) 
Propósito: Tareas programadas estilo cron
URL: http://localhost/task/test_scheduled.prg
Características:
- Tarea horaria automática (cada vez que cambia la hora)
- Tareas específicas en horarios definidos:
- 09:00 - Inicio del día
- 12:00 - Mediodía
- 18:00 - Fin del día
- 00:00 - Mantenimiento nocturno
- Archivo de salida:
.log\scheduled_tasks.txt - Verificación cada 30 segundos
Uso ideal:
- Backups programados
- Reportes periódicos
- Limpieza automática
- Sincronización de datos
Cómo Probar
Método 1: Navegador (Recomendado)
Simplemente navega en tu navegador a cualquiera de estas URLs mientras HIX.exe está corriendo:
http://localhost/task/test_init.prghttp://localhost/task/test_counter.prghttp://localhost/task/test_logger.prghttp://localhost/task/test_multiple.prghttp://localhost/task/test_status.prghttp://localhost/task/test_scheduled.prg
Método 2: Curl (Línea de comandos)
Code: Select all | Expand
curl http://localhost/task/test_init.prg
curl http://localhost/task/test_counter.prg
curl http://localhost/task/test_logger.prgMétodo 3: PowerShell
Code: Select all | Expand
Invoke-WebRequest -Uri "http://localhost/task/test_init.prg"
Verificación
Después de ejecutar las pruebas, verifica:
Salida en consola/logs de HIX:
- Busca mensajes como
[RELOJ],[STATS],[HEARTBEAT] - Verifica timestamps actualizándose
- Busca mensajes como
Archivos de log creados:
c:\hix\.log\task_logger.txt- Del test_loggerc:\hix\.log\scheduled_tasks.txt- Del test_scheduled
Comportamiento esperado:
- Las tareas deben seguir ejecutándose después de la inicialización
- Los contadores deben incrementar
- Los logs deben actualizarse periódicamente
Sugerencias de Casos de Uso Reales
Basándome en estos ejemplos, aquí hay casos de uso prácticos:
1. Backup Automático de Bases de Datos
Code: Select all | Expand
function zBackupDB()
while .t.
if Time() >= '02:00:00' .and. Time() < '02:05:00'
// Ejecutar backup a las 2 AM
BackupDatabase()
endif
hb_idleSleep(300) // Check cada 5 minutos
end
retu nil2. Monitor de Integridad de DBF
Code: Select all | Expand
function zDbIntegrityCheck()
while .t.
CheckAllDatabases()
ReportIssues()
hb_idleSleep(3600) // Cada hora
end
retu nil3. Limpieza de Archivos Temporales
Code: Select all | Expand
function zCleanupTemp()
while .t.
CleanOldFiles('.tmp', 7) // Archivos > 7 días
hb_idleSleep(86400) // Una vez al día
end
retu nil4. Sincronización con API Externa
Code: Select all | Expand
function zApiSync()
while .t.
SyncWithExternalAPI()
LogSyncStatus()
hb_idleSleep(600) // Cada 10 minutos
end
retu nil5. Generación de Reportes Programados
Code: Select all | Expand
function zDailyReports()
while .t.
if Time() >= '17:00:00' .and. Time() < '17:01:00'
GenerateDailyReport()
EmailReport()
endif
hb_idleSleep(60)
end
retu nil
Funciones Útiles de Harbour
Estas funciones son particularmente útiles en el contexto de tareas:
| Función | Descripción |
|---|---|
hb_threadStart(@func) | Inicia un thread con la función especificada |
hb_idleSleep(nSec) | Pausa el thread N segundos |
Time() | Hora actual (HH:MM:SS) |
Date() | Fecha actual |
DToC(date) | Convierte fecha a string |
Memory(0) | Memoria en uso (bytes) |
MemoRead(file) | Lee archivo de texto completo |
MemoWrit(file, content) | Escribe archivo de texto |
hb_valToStr(val) | Convierte cualquier valor a string |
Preguntas para Investigar
Gestión de tareas:
- ¿Cómo detener una tarea? (
HIX_RemoveTask(),HIX_StopTask()?) - ¿Cómo listar tareas activas? (
HIX_ListTasks()?) - ¿Cómo obtener estado de una tarea?
- ¿Cómo detener una tarea? (
Límites:
- ¿Cuántas tareas concurrentes soporta HIX?
- ¿Hay límite de memoria por tarea?
Persistencia:
- ¿Las tareas sobreviven un reinicio de HIX?
- ¿Se pueden auto-iniciar tareas al arrancar el servidor?
Comunicación:
- ¿Pueden las tareas compartir datos entre sí?
- ¿Hay mecanismos de sincronización disponibles?
Monitoreo:
- ¿Existe un dashboard para ver tareas activas?
- ¿Se puede ver el output de las tareas en tiempo real?
Checklist de Pruebas
- Ejecutar
test_init.prgy verificar logs - Ejecutar
test_counter.prgy ver incremento - Ejecutar
test_logger.prgy revisar archivo.log\task_logger.txt - Ejecutar
test_multiple.prgy verificar 3 tareas concurrentes - Ejecutar
test_scheduled.prgy esperar al cambio de hora - Verificar que las tareas siguen corriendo después de minutos
- Intentar detener tareas (si existe la funcionalidad)
- Intentar listar tareas activas
- Monitorear uso de CPU/memoria con múltiples tareas
- Probar qué pasa si se reinicia HIX.exe
Conclusión
He creado una suite completa de ejemplos que cubren:
Inicialización básica de tareas
Persistencia de estado con variables
I/O de archivos desde threads
Múltiples tareas concurrentes
Tareas programadas estilo cron
Casos de uso prácticos documentados
Los archivos están listos para probar. Simplemente navega a las URLs correspondientes mientras HIX.exe está corriendo en localhost.
Resumen de Archivos
| Archivo | Líneas | Propósito |
|---|---|---|
| [test_init.prg](file:///c:/hix/test_init.prg) | 15 | Reloj básico |
| [test_counter.prg](file:///c:/hix/test_counter.prg) | 17 | Contador incremental |
| [test_logger.prg](file:///c:/hix/test_logger.prg) | 22 | Sistema de logging |
| [test_multiple.prg](file:///c:/hix/test_multiple.prg) | 47 | Tareas concurrentes |
| [test_status.prg](file:///c:/hix/test_status.prg) | 16 | Monitor de estado |
| [test_scheduled.prg](file:///c:/hix/test_scheduled.prg) | 68 | Tareas programadas |
| TOTAL | 185 | 6 ejemplos completos |
¡Listo para probar!


