02 junio 2008

Multihilos en xHarbour - Parte I

Como toda cosa nueva, como todo cambio, siempre cuesta y siempre genera incertidumbre.
Crear programas multihilos es un cambio respecto de la programación habitual, pero la verdad, es que la teoria de los multihilos es muy simple.

Usar multihilos es tan simple de usar como el SQL.
El SQL tiene 7 comandos.
Para usar multihilos es suficiente con conocer cerca de 10 instrucciones.

¿Tan simple es?
Bueno, la respuesta es un poco más compleja que un Si o un No.

Si nos guiamos por la cantidad de instrucciones/funciones a usar, y por la sencilla explicación de lo que hace cada una de ellas, contestaría que Si.

Pero. ¿Es posible medir la simplicidad de la programación por la cantidad de instrucciones que posee?

Yo, como muchos, creo que la programación es un arte como lo es la pintura. Ahora, si es tan simple combinar colores, ¿por qué yo no soy un pintor? ¿Por qué no pagarían ni 10 centavos por una "obra" mía?

Nuestra diseñadora gráfica me contestaría que no es suficiente con saber combinar. También hay que saber cómo combinar los colores (y tener buen gusto, algo que no es mi fuerte).

Ahh, así que no es suficiente con conocer 5, 7 o 10 instrucciones, también es necesario saber cómo y cuándo usarlas y cada una de sus opciones.

Al igual que los corredores profesionales de autos, no solo saben manejar muy bien, también conocen de mecánica y de aerodinámica, y además, horas y horas de prácticas para conocer los límites del auto.

Un programador debe conocer las instrucciones, cuándo aplicarlas y cómo combinarlas, pero en la alta competencia no es suficiente.
Además debe conocer pormenores del motor de ejecución y pormenores del sistema operativo.
Eso se aplica tanto al SQL como a los multihilos.

Quizás esta introducción no es muy amigable, pero es la realidad. La teoría es sencilla, pero la práctica algunas veces se complica, pero con práctica y buenas normas de programación para multihilos, se podrá salir adelante.

Pero mejor, vayamos a los multihilos que es el tema.

Primera ejecución de una función en paralelo

La ejecución de una rutina en paralelo con otra es muy sencilla. Sólo es suficiente con poner StartThread( @enparalelo() ) para que la función enparalelo() comience a ejecutarse.

//-----------------------------------------------
Static lFinalizar := .f.

Function Main()
cls
StartThread(@enparalelo())
DevOut("Presione una tecla para finalizar",,1,0)
inkey(0)

Procedure enparalelo()
Local nStatus := 1, cStatus := "|/-\"
Local nLinea := GetThreadId()
do while !lFinalizar
  DevOut(cStatus[nStatus],,nLinea,10)
  if ++nStatus > 3
    nStatus := 1
  endif
  ThreadSleep(500)
enddo
Return
//-----------------------------------------------


De la misma forma, si ejecutamos 2 veces StartThread(), estaremos haciendo que se ejecuten 2 hilos.


Function Main()
cls
StartThread(@enparalelo())
StartThread(@enparalelo())
DevOut("Presione una tecla para finalizar",,1,0)
inkey(0)


Es posible pasar parámetros al thread? Si.

StartThread(@enparalelo(),xParam1,xParam2,...)


Resumiendo, estas son las opciones de ejecución para lanzar threads.

// usando puntero a la funcion (puede ser publica o estatica)
StartThread(@funcion(),)

// usando el nombre de la funcion (debe ser publica)
StartThread("funcion",)

// usando el nombre del metodo
StartThread(objeto,"metodo",)

// usando el puntero al metodo
StartThread(objeto,__ObjPtr(objeto,"metodo"),)

// usando un codeblock
StartThread(codeblock,)

Antes de finalizar esta primera entrega, voy a dar una lista de las funciones que se usan en multihilos y de las cuales veremos sus usos, comportamientos, casos de uso y advertencias de uso.

HB_MutexCreate
HB_MutexLock
HB_MutexUnlock
HB_MutexTryLock
HB_MutexTimeOutLock

Subscribe
SubscribeNow
Notify
NotifyAll

StopThread
JoinThread
KillThread
WaitForAllThreads
GetThreadId

Hasta la próxima

7 comentarios:

Anónimo dijo...

Fantástico Walter!
Sería muy interesante saber como compilar los ejemplos de multihilo, si es necesario especificar algo en el compilador de Harbour, etc...

Quizás sea el momento de dotar a alguna gui el tema del Multihilo, la verdad es que estoy bastante interesado en ello.

Anónimo dijo...

Sorry, el comentario anterior, Rafa Carmona.

Biel Maimó dijo...

Un tema muy intersante Walter.
Me ha gustado mucho su lectura, y estoy ansioso de leer las siguientes entregas.

Buen trabajo.

Saludos desde Mallorca
Biel Maimo

Anónimo dijo...

Walter: Es un tema muy interesante que todos queremos meterle mano, pero... si nos muestras el camino.

Pd: Tu postura es muy pedagogica, me gusta.
Atte.
CDG
San Clemente del Tuyú
Buenos Aires-Argentina

Anónimo dijo...

Muy buena publicación, aunque no he logrado compilar los ejemplos porque me da error Unresolved external '_HB_FUN_STARTTHREAD' y lo mismo con '_HB_FUN_GETTHREADID'.

Hay que tener en cuenta algo especial para compilar los ejemplos ?

Smith.

Anónimo dijo...

Ya leí la publicación que hicieron sobre cómo compilar los ejemplos y salió todo bien.

Muy buen trabajo.

Smith.

Anónimo dijo...

Interezante el tema, lo seguiere masticando.

Pero tengo una inuietud, he programado en VFP, y puede trabajar en secciones provadas de datos, de tal modo que puede toner una ventana multiples veses abierta, como se puede reralizar esta operacion en xharbour "en una sola terminal"

Ernesto William