Multi-Thread

HMG en Español

Moderator: Rathinagiri

User avatar
Ismach
Posts: 166
Joined: Wed Nov 28, 2012 5:55 pm
DBs Used: DBF, mySQL, Mariadb, postgreSQL, Oracle, Db2, Interbase, Firebird, and SQLite
Location: Buenos Aires - Argentina

Re: Multi-Thread

Post by Ismach »

Es un concepto devivado del MULTIPROCESO,
el MULTIPROCESO puede ser :
un proceso MULTIHILO o
un proceso MULTIPROCESO PROPIAMENTE DICHO.
la diferencia es que en el multihilo es la division de un proceso en hilos de ejecucion? como se hace?
en C + C++ se hace con la fucnion fork() en este caso cuando un hilo de ejecucion comparte aun las variables del hilo principal
y cuando finaliza vuelve al hilo principal de ejecucion....

En cambio en el MULTIPROCESO PROPIAMENTE DICHO se realiza con la funcion thread() es es un proceso totalmente distinto... aunque se puede comunicar con el proceso principal si lo miras por linea de comando lo podes ver como un proceso distinto al del principal, en cambio en el fork() no se ve por linea de comando cuando se este ejecutando... cuando digo linea de comando es ps -ef | grep nameproceso
en el thread() generalmete se usa conexiones tcp/ip a traves de la fucnion select() ( bolsa de conectores o bolsa de handles )
el proceso principal acepta la conexion deun cliente y genera un proceso que trate y responda a esa conexion y el sigue escuchando y listo para aceptar otra conexion, los procesos nacientes desde thread() se deben matar si o si con exit() caso contrario quedara zombies que tarde o temprano generan señales de interrupcion por ejemplo Signal 11. saludos
User avatar
fchirico
Posts: 324
Joined: Sat Aug 23, 2008 11:27 pm
Location: Argentina

Re: Multi-Thread

Post by fchirico »

Gracias Ismach!

Ahora sé un poco más.
Saludos, Fernando Chirico.
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Multi-Thread

Post by SALINETAS24 »

Hola a todos.

Por no abrir un nuevo tema, me engancho a este y os traslado mi problemilla.

Por Ejemplo

Tengo una Window que tiene un botón y que cada vez que se pulsa abre un nuevo "hb_Thereadstard" y crea una nueva ventana. Por lo que cada vez que se pulsa el botón crea una nueva ventana.

Code: Select all

aMulti[1]:=(hb_threadStart(3, @WinDatos() ,1))
Tengo claro que con aMulti[1] puedo saber si la ventana ya esta creada, y evitar que se vuelva a ejecutar, pero la pregunta es..., si la ventana ya ha sido creada y estoy en el hilo principal...

¿Puedo darle el foco a la ventana creada en un "hb_Thereadstard" ...?
¿Puedo hacerle un restore ...?

Agradecidos de antemano por vuestra ayuda, saludos y cervecita fresquita
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: Multi-Thread

Post by andyglezl »

Viéndolo por el tema de aprendizaje, habría que probar...

Pero por el lado práctico, porque no crear la ventana de forma normal
o desactivar el botón después de la primer ejecución y activarlo al cerrarla ?
Andrés González López
Desde Guadalajara, Jalisco. México.
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Multi-Thread

Post by SALINETAS24 »

Hola Andy, gracias por contestar.

Lo que estoy intentado hacer es una aplicación multitarea que permita al usuario cambiar de ventana sin necesidad de ir cerrando y abriendo . En el enlace puedes ver el problema con el GRID y la forma "poco" ortodoxa de solucionarlo.

http://www.hmgforum.com/viewtopic.php?f=24&t=7169

Ahora estoy probando con Multi-Thread

aMulti[1]:=(hb_threadStart(3, @WinDatos() ,1))

Pero cuando pierde el foco la ventana creada con "hb_threadStart" y regresa a la ventana principal me gustaría saber

¿como puedo devolverle el foco ?

No consigo tener acceso a la ventana creada con "hb_threadStart" desde el hilo principal.

Te pongo un ejemplo a modo de prueba, verás que he conseguido no aperturar nuevas ventana pero no puedo actualiza los datos cada vez que hago DBLCLIK sobre el GRID.

He intentado varias cosas pero el resultado siempre es el mismo ...., puaj!!!

¿Alguien tiene alguna idea..?

Gracias por anticipado y vamos con una cervecita...
Attachments
MT_GridIncrementalSearch.rar
(1.21 MiB) Downloaded 106 times
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: Multi-Thread

Post by andyglezl »

SALINETAS24 wrote: Thu Feb 10, 2022 9:51 am Hola Andy, gracias por contestar.
Hola Salinetas, tu ejemplo me dio algunos errores.

Pero como te comentaba: "Viéndolo por el tema de aprendizaje, habría que probar..."
imagen_2022-02-10_102028.png
imagen_2022-02-10_102028.png (254.75 KiB) Viewed 12306 times


Aquí te dejo un ejemplo de multiventanas, digamos de una forma "normal"
El tema es que usándolo de esta forma, el "ONDBLCLICK" del GRID deja de funcionar
y se tiene que manejar con "flechas" y ENTER.
(ya en alguna ocasión lo comente aquí en el foro, parece que es un bug)
*-------------------------------------------------------------------------------------------------------
Here is an example of multi-windows, let's say in a "normal" way
The issue is that using it in this way, the "ONDBLCLICK" of the GRID stops working
and it has to be handled with "arrows keys" and ENTER.
(I already commented on it here in the forum on some occasion, it seems that it is a bug)
imagen_2022-02-10_102851.png
imagen_2022-02-10_102851.png (54.33 KiB) Viewed 12306 times
MultiVent.zip
(1.47 MiB) Downloaded 124 times
Andrés González López
Desde Guadalajara, Jalisco. México.
User avatar
AUGE_OHR
Posts: 2117
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: Multi-Thread

Post by AUGE_OHR »

hi Salinetas,
SALINETAS24 wrote: Thu Feb 10, 2022 9:51 am aMulti[1]:=(hb_threadStart(3, @WinDatos() ,1))
i "think" it is "not enough"
this Way you "just" inherit Memvars to your new Thread

Code: Select all

   aThread[ 1 ] := hb_threadStart( HB_THREAD_INHERIT_PUBLIC + HB_THREAD_INHERIT_MEMVARS, @Wait4Action() )
this call Wait4Action() and inherit PUBLIC and MemVars Variable

but there are "more" like

Code: Select all

   nMainThreadID := GetCurrentThreadID()
   hForm := GetFormhandle( "Win_1" )
   // HMG Syntax
   HMG_ThreadShareData( 1, hForm )
so it need

Code: Select all

   AttachThreadInput( nMainThreadID, HMG_ThreadHBtoWinID( aThread[ 1 ] ), .T. )
which make Keyboard "Input" from Thread available to "Main" and do NOT "block Main" when DblClick

---

to get "more" Information you can use something like this

Code: Select all

   aMulti[i][1]:= hb_threadStart(1+3, @WinDatos() ,1)
   aMulti[i][2]:= "myWindow" + STRTZERO(i,3)
   aMulti[i][3]:= 0      // to be fill with ThreadID()
than you can ASCAN() Array for your Thread Window
have fun
Jimmy
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Multi-Thread

Post by SALINETAS24 »

andyglezl wrote: Thu Feb 10, 2022 4:42 pm

Hola Salinetas, tu ejemplo me dio algunos errores.

Pero como te comentaba: "Viéndolo por el tema de aprendizaje, habría que probar..."
The attachment imagen_2022-02-10_102028.png is no longer available
Hola Andy, Auge.., gracias por contestar.

Efectivamente Andy el ejemplo da errores, no lo habia depurado, solo queria enseñar una muestra del problema. ;)

Por otro lado diré, que yo .., al igual que otros muchos de este foro.., no me importa compartir, es más.., siempre intento facilitar las cosas al resto de compañeros de viaje en HMG, y poner programas ejecutables que aportan solución o que presentan errores para buscar la solución .., creo que se agradece bastante cuando podemos descargar y comprobar in situ aquello que le quita el sueño al compañero, o cuando aportamos una solución completa. :)
Debeis de tener en cuenta que no todos tenemos ni el mismo nivel de programación, ni el mismo nivel de inglés, y en ocasiones un "PRG" facilita mucho las cosas.
Pido disculpas si alguien se sintio ofendido... :oops:

Dicho esto...., aqui os presenta un modulo "PRG" que trabaja con multiples ventanas :idea: sin tener problemas con el GRID y con un control total de las mismas. :ugeek:

Cosas a tener en cuenta..
aMulti[1] --> Es un array que contiene el control de la ventanas hijas, yo como solo uso uno lo tengo asi, si quieres más tendras que adaptarlo (aMulti:={}.., etc, etc.)
hWnd --> Esta variable, si vas a usar más de una ventana, tambien tendria que ser un array.....

Pero lo mejor es que te lo descargues y lo pruebes.
Lo voy a poner tambien en otra parte del foro que tambien se trato este tema.

Lo dicho, gracias a todos y vamos con una cervecita bien fresquita que corre de mi cuenta !!!
Attachments
multiwin.rar
(1.21 MiB) Downloaded 150 times
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Multi-Thread

Post by SALINETAS24 »

andyglezl wrote: Thu Feb 10, 2022 4:42 pm
Aquí te dejo un ejemplo de multiventanas, ....
...(ya en alguna ocasión lo comente aquí en el foro, parece que es un bug)
Hola Andy, no tienes ningún bug, el problema es el control del DBLCLICK.
Digamos que cuando haces DBLCLICK en un GRID y se activa, se ejecuta lo que tienes puesto (crear la ventana child), pero el puntero de control de ejecucion del programa se queda pendiente, como parado en el DBLCLICK, esperando a que termines la ejecución de la ventana y como no es MODAL, hay es cuando se lia... :(
Si se pudiese limpiar de alguna forma el evento que tiene en cola, :?: yo lo probé en su día con "StopControlEventProcedure" y otras parecidas pero no lo conseguí. :oops:

Otra opción que tambien me tuvo liado fue la de implementar un evento..., mira estas dos lineas.. :geek:
La primera no hace nada, ya que crea el evento, y lo destruye (no llega a carga la ventana) y la segunda al no conseguir detener el evento se vuelve loco :?
ONDBLCLICK (Create Event ProcName WinXX( "Ventana" )) ,EventSTOP( EventCount(),.t.) )
ONDBLCLICK Create Event ProcName WinXX( "Ventana" ))

Ahora estoy con el tema "hb_thread" y estoy consiguiendo resultados bastante aceptables, (cuando lo tenga lo colgare, estoy probando con el manejo de datos de una DBF), aunque reconozco que lo suyo seria poder utilizar las ventanas CHILD desde un GRID o BROWSE sin problemas.

Si algun colega tiene alguna ocurrencia :idea: al respeto, agradecido de antemano..., vamos con una cervecita fresquita!!
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
Claudio Ricardo
Posts: 367
Joined: Tue Oct 27, 2020 3:38 am
DBs Used: DBF, MySQL, MariaDB
Location: Bs. As. - Argentina

Re: Multi-Thread

Post by Claudio Ricardo »

Hola... para no crear un nuevo hilo hago mi pregunta acá donde están tratando el tema.
Tengo una función Ping (cIp) en un Timer cada 60 segundos en Main.prg ... hasta aqui todo bién...
muestra un icono verde si Ok o rojo si falló el ping... pero mientras lo hace, se congela el
programa durante un segundo aproximadamente, y, si no hay conección, hasta 10 segundos
durante los cuales el usuario impaciente "pincha" botones hasta que "kaput" con el programa...
(para evitarlo tuve que comentar todas esas lineas del .prg perdiendo esa funcionalidad)

Cómo pongo esa rutina en un hilo independiente para que no afecte al resto del programa ?
Desde yá muy agradecido a todos !
Corrige al sabio y lo harás más sabio, Corrige al necio y lo harás tu enemigo.
WhatsApp / Telegram: +54 911-63016162
Post Reply