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.
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
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
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
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
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 activas
- HIX_GetTaskStatus() - Para obtener estado de una tarea
- HIX_ListTasks() - Para enumerar todas las tareas
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
Simplemente navega en tu navegador a cualquiera de estas URLs mientras HIX.exe está corriendo:
- http://localhost/task/test_init.prg
- http://localhost/task/test_counter.prg
- http://localhost/task/test_logger.prg
- http://localhost/task/test_multiple.prg
- http://localhost/task/test_status.prg
- http://localhost/task/test_scheduled.prg
Code: Select all | Expand
curl http://localhost/task/test_init.prg
curl http://localhost/task/test_counter.prg
curl http://localhost/task/test_logger.prgCode: Select all | Expand
Invoke-WebRequest -Uri "http://localhost/task/test_init.prg"Después de ejecutar las pruebas, verifica:
Salida en consola/logs de HIX:
- Busca mensajes como [RELOJ], [STATS], [HEARTBEAT]
- Verifica timestamps actualizándose
Archivos de log creados:
- c:\hix\.log\task_logger.txt - Del test_logger
- c:\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
Basándome en estos ejemplos, aquí hay casos de uso prácticos:
1. Backup Automático de Bases de DatosCode: 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 nilCode: Select all | Expand
function zDbIntegrityCheck()
while .t.
CheckAllDatabases()
ReportIssues()
hb_idleSleep(3600) // Cada hora
end
retu nilCode: Select all | Expand
function zCleanupTemp()
while .t.
CleanOldFiles('.tmp', 7) // Archivos > 7 días
hb_idleSleep(86400) // Una vez al día
end
retu nilCode: Select all | Expand
function zApiSync()
while .t.
SyncWithExternalAPI()
LogSyncStatus()
hb_idleSleep(600) // Cada 10 minutos
end
retu nilCode: 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 nilEstas funciones son particularmente útiles en el contexto de tareas:
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?
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?
- [ ] Ejecutar test_init.prg y verificar logs
- [ ] Ejecutar test_counter.prg y ver incremento
- [ ] Ejecutar test_logger.prg y revisar archivo .log\task_logger.txt
- [ ] Ejecutar test_multiple.prg y verificar 3 tareas concurrentes
- [ ] Ejecutar test_scheduled.prg y 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
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.
---¡Listo para probar!


