Controles de Hilos
La pestania Hilos proporciona 8 controles para programacion concurrente: hilos, primitivas de sincronizacion, grupos de hilos y canales de comunicacion entre hilos. Todos los controles son multiplataforma y utilizan las instalaciones de hilos nativas del sistema operativo.
TThread CT_THREAD = 63
Ejecuta codigo en un hilo separado del sistema operativo. El bloque fundamental para operaciones concurrentes.
| Propiedad | Tipo | Valor predet. | Descripcion |
nPriority | Numerico | 0 | Prioridad del hilo (-2 mas baja a +2 mas alta) |
lFreeOnTerminate | Logico | .F. | Destruir automaticamente el objeto cuando el hilo termina |
lRunning | Logico | .F. | El hilo se esta ejecutando actualmente (solo lectura) |
lFinished | Logico | .F. | El hilo ha completado (solo lectura) |
nThreadId | Numerico | 0 | Identificador de hilo del sistema operativo (solo lectura) |
| Evento | Categoria | Descripcion |
OnExecute | Ciclo de vida | Codigo a ejecutar en el hilo (requerido) |
OnTerminate | Ciclo de vida | Hilo termino su ejecucion (llamado en el hilo principal) |
| Metodo | Descripcion |
Start() | Iniciar la ejecucion del hilo |
Wait( nTimeout ) | Esperar a que el hilo termine. Tiempo de espera opcional en ms |
Cancel() | Solicitar cancelacion cooperativa |
| Plataforma | Implementacion Nativa |
| Windows | CreateThread / _beginthreadex |
| macOS | pthread_create |
| Linux | pthread_create |
TMutex CT_MUTEX = 64
Bloqueo de exclusion mutua. Asegura que solo un hilo acceda a un recurso compartido a la vez.
| Metodo | Descripcion |
Lock() | Adquirir el mutex. Se bloquea si otro hilo ya lo tiene |
Unlock() | Liberar el mutex |
TryLock() | Intentar adquirir sin bloqueo. Devuelve .T. si se adquirio |
| Plataforma | Implementacion Nativa |
| Windows | CRITICAL_SECTION |
| macOS | pthread_mutex_t |
| Linux | pthread_mutex_t |
TSemaphore CT_SEMAPHORE = 65
Semaforo de conteo. Controla el acceso a un grupo de recursos compartidos con un conteo limitado.
| Propiedad | Tipo | Valor predet. | Descripcion |
nInitialCount | Numerico | 0 | Conteo inicial del semaforo |
nMaxCount | Numerico | 1 | Conteo maximo del semaforo |
| Metodo | Descripcion |
Wait( nTimeout ) | Decrementar conteo. Se bloquea si el conteo es cero. Tiempo de espera opcional en ms |
Signal() | Incrementar conteo. Despierta un hilo en espera |
TCriticalSection CT_CRITICALSECTION = 66
Primitiva de sincronizacion ligera. Mas rapida que TMutex para proteger secciones de codigo cortas dentro del mismo proceso.
| Metodo | Descripcion |
Enter() | Entrar en la seccion critica. Se bloquea si otro hilo esta dentro |
Leave() | Salir de la seccion critica |
TryEnter() | Intentar entrar sin bloqueo. Devuelve .T. si entro |
TThreadPool CT_THREADPOOL = 67
Gestiona un grupo de hilos de trabajo reutilizables. Envie tareas al grupo en lugar de crear hilos individuales.
| Propiedad | Tipo | Valor predet. | Descripcion |
nMinThreads | Numerico | 2 | Numero minimo de hilos de trabajo |
nMaxThreads | Numerico | 8 | Numero maximo de hilos de trabajo |
nQueueSize | Numerico | 256 | Tamano maximo de la cola de tareas pendientes |
nActiveThreads | Numerico | 0 | Hilos de trabajo activos actualmente (solo lectura) |
nPendingTasks | Numerico | 0 | Tareas en espera en la cola (solo lectura) |
| Evento | Categoria | Descripcion |
OnTaskComplete | Ciclo de vida | Una tarea termino su ejecucion. Parametros: xResult, nTaskId |
OnError | Error | Una tarea genero un error. Parametros: oError, nTaskId |
| Metodo | Descripcion |
Submit( bTask ) | Anadir una tarea (bloque de codigo) a la cola. Devuelve nTaskId |
WaitAll( nTimeout ) | Esperar a que todas las tareas pendientes se completen |
Shutdown() | Detener todos los hilos despues de completar tareas pendientes |
TAtomicInt CT_ATOMICINT = 68
Entero atomico sin bloqueo. Proporciona operaciones de contador seguras para hilos sin bloqueo explicito.
| Metodo | Descripcion |
Inc() | Incrementar atomicamente en 1. Devuelve nuevo valor |
Dec() | Decrementar atomicamente en 1. Devuelve nuevo valor |
Get() | Leer valor actual |
Set( nValue ) | Establecer atomicamente a nValue |
CompareExchange( nExpected, nNew ) | Si actual == nExpected, establecer a nNew. Devuelve .T. si se intercambio |
Add( nValue ) | Sumar atomicamente nValue. Devuelve nuevo valor |
| Plataforma | Implementacion Nativa |
| Windows | InterlockedIncrement / InterlockedCompareExchange |
| macOS | __atomic builtins (GCC/Clang) |
| Linux | __atomic builtins (GCC/Clang) |
TCondVar CT_CONDVAR = 69
Variable de condicion. Permite a los hilos esperar hasta que otra hilo senalice una condicion particular.
| Metodo | Descripcion |
Wait( oMutex, nTimeout ) | Liberar mutex y esperar senal. Readquiere mutex al despertar. Tiempo de espera opcional en ms |
Signal() | Despertar un hilo en espera |
Broadcast() | Despertar todos los hilos en espera |
| Plataforma | Implementacion Nativa |
| Windows | CONDITION_VARIABLE |
| macOS | pthread_cond_t |
| Linux | pthread_cond_t |
TChannel CT_CHANNEL = 70
Canal de mensajes seguro para hilos para comunicacion entre hilos. Inspirado en los canales de Go y la concurrencia CSP.
| Propiedad | Tipo | Valor predet. | Descripcion |
nBufferSize | Numerico | 0 | Capacidad del buffer (0 = sin buffer/sincrono) |
lClosed | Logico | .F. | El canal ha sido cerrado (solo lectura) |
| Metodo | Descripcion |
Send( xValue ) | Enviar un valor al canal. Se bloquea si el buffer esta lleno |
Receive() | Recibir un valor del canal. Se bloquea si esta vacio |
TryReceive( @xValue ) | Recepcion sin bloqueo. Devuelve .T. si habia un valor disponible |
Close() | Cerrar el canal. No se pueden enviar mas valores |
| Evento | Categoria | Descripcion |
OnReceive | Datos | Valor recibido (alternativa a sondeo). Parametros: xValue |
Ejemplo de Codigo: Patron Productor-Consumidor
// Patron productor-consumidor usando TChannel y TThread
FUNCTION Main()
LOCAL oChannel, oProducer, oConsumer
// Crear un canal con buffer de capacidad 10
oChannel := TChannel():New()
oChannel:nBufferSize := 10
// Hilo productor: genera elementos de trabajo
oProducer := TThread():New()
oProducer:lFreeOnTerminate := .T.
oProducer:OnExecute := { || ProduceItems( oChannel ) }
// Hilo consumidor: procesa elementos de trabajo
oConsumer := TThread():New()
oConsumer:lFreeOnTerminate := .T.
oConsumer:OnExecute := { || ConsumeItems( oChannel ) }
// Iniciar ambos hilos
oProducer:Start()
oConsumer:Start()
// Esperar a que el productor termine, luego cerrar canal
oProducer:Wait()
oChannel:Close()
// Esperar a que el consumidor procese elementos restantes
oConsumer:Wait()
QOut( "Todo listo!" )
RETURN NIL
FUNCTION ProduceItems( oChannel )
LOCAL n
FOR n := 1 TO 100
oChannel:Send( "Tarea #" + Str( n ) )
QOut( "Producido: Tarea #" + Str( n ) )
NEXT
RETURN NIL
FUNCTION ConsumeItems( oChannel )
LOCAL xItem
DO WHILE ! oChannel:lClosed .OR. oChannel:TryReceive( @xItem )
xItem := oChannel:Receive()
IF xItem != NIL
QOut( "Consumido: " + xItem )
ENDIF
ENDDO
RETURN NIL
8 Controles de Hilos
Todas las primitivas de hilos se asignan directamente a las instalaciones nativas del sistema operativo para maximo rendimiento. Use TChannel para comunicacion segura entre hilos en lugar de variables compartidas con bloqueos.