FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Soporte Multithread en xHarbour
Posts: 144
Joined: Sun Dec 18, 2005 03:18 PM
Soporte Multithread en xHarbour
Posted: Wed Feb 10, 2010 05:09 PM

驴Alguien ha probado el soporte multithread en Xharbour?. 驴Es robusto y estable?.
Estoy pensando en migrar un proyecto con sockets de FWH a sockets de xHarbour con multithreads pero quisiera estar seguro de no encontrar problemas antes de iniciarlo.

Agradezco opiniones.

Saludos

Salvador
Posts: 1335
Joined: Fri Jun 13, 2008 11:04 AM
Re: Soporte Multithread en xHarbour
Posted: Thu Feb 11, 2010 07:53 AM
Mr.Salvador,

He intentado multithreading utilizando xHarbour y Borland, pero la aplicaci贸n se bloquea.

Por favor, revise el hilo por debajo de determinado.

http://forums.fivetechsupport.com/viewtopic.php?f=3&t=18008&start=15#p94458

Anser
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Soporte Multithread en xHarbour
Posted: Thu Feb 11, 2010 10:28 AM

Salvador,

En la misma conversaci贸n que te indica Anser, revisa esto:

viewtopic.php?p=94639#p94639

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 144
Joined: Sun Dec 18, 2005 03:18 PM
Re: Soporte Multithread en xHarbour
Posted: Thu Feb 11, 2010 11:19 PM

Si no entiendo mal, el multithreading con Harbour y parte de FWH funciona, pero Harbour no tiene soporte para sockets, o me equivoco?.

Saludos

Salvador
Posts: 144
Joined: Sun Dec 18, 2005 03:18 PM
Re: Soporte Multithread en xHarbour
Posted: Sun Feb 14, 2010 11:31 AM

Antonio,

驴Se puede con Harbour incluir objetos de FWH como TSocket o Ttimer dentro de un thread?

Saludos

Salvador
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Soporte Multithread en xHarbour
Posted: Sun Feb 14, 2010 03:22 PM

Salvador,

Por lo visto la limitaci贸n que impone Windows para el uso de threads es que los mensajes de Windows han de procesarse en el mismo thread en donde se haya creado la ventana. De no seguir esta regla se producir铆an GPFs propios de Windows.

En caso de ser asi, hay que prestar atenci贸n a no procesar ningun mensaje de Windows en un thread distinto al thread principal, suponiendo que en el thread principal se haya creado la ventana.

Tanto TSocket como TTimer hacen que Windows envie mensajes a la ventana, mensajes que hay que procesar en el mismo thread de la ventana. Es por esto que te comento lo anterior :-)

Nosotros aun no hemos probado este tipo de c贸digo, pero supuestamente si queremos procesar mensajes en un thread, entonces la ventana que reciba los mensajes ha de ser creada en ese mismo thread.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 144
Joined: Sun Dec 18, 2005 03:18 PM
Re: Soporte Multithread en xHarbour
Posted: Sun Feb 14, 2010 08:33 PM
Este c贸digo:
Code (fw): Select all Collapse
function Main()
Local 聽oWnd
聽
聽聽 聽PUBLIC oApp
聽 聽 
聽 聽DEFINE WINDOW oWnd 
聽 聽
聽 聽ACTIVATE WINDOW oWnd MAXIMIZED;
聽 聽ON INIT 聽( oApp := Tapp():New( oWnd ), 聽StartThread(@StartServer(), oApp), WaitForThreads() ) 聽;

return nil

procedure StartServer(oApp )
local oSocket
LOCAL pMutex 聽 := HB_MutexCreate()

oSocket = TSocket():New( 8083 )
oApp:oSocket := oSocket
oSocket:bAccept := { || StartThread( {|| Tserver():New( TSocket():Accept( oSocket:nSocket ), pMutex, oApp 聽)} ) }
oSocket:Listen()
LogFile( "thread.log",{"Inicia Server Thread: ", Str( GetSystemThreadID() )} ) // thread 2

return


El objeto creado en el Thread 2 sus m茅todo se ejecutan en el TH 1.

En qu茅 谩mbito hay que crearlo para que se ejecute en el TH2 ?
Saludos

Salvador
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Soporte Multithread en xHarbour
Posted: Sun Feb 14, 2010 08:54 PM

Salvador,

Ese c贸digo te funciona bien ?

En caso de que no te funcionase, prueba a crear la ventana desde la misma funci贸n en donde creas el socket.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 144
Joined: Sun Dec 18, 2005 03:18 PM
Re: Soporte Multithread en xHarbour
Posted: Mon Feb 15, 2010 12:21 AM

Si funciona perfecto, pero GetSystemThreadID() llamado desde el objeto siempre retorna 1 a pesar de que hay varios objetos creados al mismo tiempo, por lo que parece que el objeto no se ejecuta desde un nuevo thread cada vez.

Saludos

Salvador
Posts: 144
Joined: Sun Dec 18, 2005 03:18 PM
Re: Soporte Multithread en xHarbour
Posted: Mon Feb 15, 2010 10:27 PM
Si creamos un objeto sin asignarlo a una variable , 驴como se libera la memoria que utiliza una vez este finaliza su ejecuci贸n?. En su metodo End() se puede hacer algo as铆:
Code (fw): Select all Collapse
METHOD End() 聽
self := nil 
return nil

Lo he probado, no genera ning煤n error, pero realmente no se si es correcto hacerlo de este modo.
Saludos

Salvador
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Soporte Multithread en xHarbour
Posted: Tue Feb 16, 2010 08:14 AM

Salvador,

No es necesario hacer nada. El recolector de basuras lo destruye automaticamente una vez ya no est茅 en uso, es decir, no est茅 guardado en una variable est谩tica, elemento de un array, etc.

La forma de llamar al recolector de basuras es usando hb_gcAll(). FWH lo llama automaticamente cuando se sale desde un di谩logo.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 144
Joined: Sun Dec 18, 2005 03:18 PM
Re: Soporte Multithread en xHarbour
Posted: Tue Feb 16, 2010 06:57 PM
De eso hablo de crearlo sin asignarlo a ninguna variable, ejemplo:

Code (fw): Select all Collapse
Function Main()
local oWnd

聽 聽 DEFINE WINDOW oWnd 聽

聽 聽 ACTIVATE WINDOW oWnd;
聽 聽 ON INIT Tobjeto():New(oWnd)

return nil

CLAS Tobjeto
METHOD New(oWnd)
METHOD End()
ENDCLASS

METHOD New(oWnd) CLASS Tobjeto
local oTimer 聽 聽:= Ttimer():New( 3000, { || ::End() }, oWnd)
oTimer:Activate()
return self 

METHOD End() CLASS Tobjeto
hb_gcall()
return nil

Se auto destruye ?
Saludos

Salvador
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Soporte Multithread en xHarbour
Posted: Tue Feb 16, 2010 07:23 PM

Salvador...

si se "autodestruye"... cuando cierras la ventana, envias un mensaje WM_CLOSE a la misma, este mensaje es capturado por FW para llamar al metodo destroy que a su vez "mata" todos los controles hijos que le pertenescan, window se encarga de enviar el mismo mensaje (WM_CLOSE) a sus hijos, en este caso elimina el timer que tienes activo sin necesidad que llames a "END" propio del timer

Posts: 144
Joined: Sun Dec 18, 2005 03:18 PM
Re: Soporte Multithread en xHarbour
Posted: Tue Feb 16, 2010 10:06 PM

Gracias Daniel, queda claro.
Pero creando una CLASSDATA {} y a帽adiendo cada objeto creado, despu茅s pueden ser eliminados desde la misma clase liberando la memoria 驴no?

Saludos

Salvador
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Soporte Multithread en xHarbour
Posted: Tue Feb 16, 2010 10:10 PM
Salvador,

Code (fw): Select all Collapse
    ACTIVATE WINDOW oWnd;
    ON INIT Tobjeto():New(oWnd)

En ese c贸digo est谩s guardando el objeto dentro de un codeblock, y hasta que ese codeblock no se limpiase (porque su objeto contenedor a su vez se limpie) el objeto sigue existiendo.
regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion