Autor Tema: Multihilos  (Leído 4352 veces)

Transdiv

  • Full Member
  • ***
  • Mensajes: 235
  • Karma: 13
Multihilos
« en: Septiembre 03, 2012, 12:43:42 pm »
Una consulta; Que hace mucho que no hago una DLL. La duda me viene a raiz de la respuesta de FreeMind sobre su modulo Beep respondiendo que tendria que usar threads para que su modulo no detuviera totalmente la ejecución del Bennu hasta que esta retorne. Hasta adonde recuerdo los procesos son implementados por software sin usar los threads del sistema, o eso ha cambiado ultimamente?; Si no usa hilos, eso quiere decir que es total responsabilidad del programador de la DLL, si es que queremos que esta sea interactiva, la de retornar cada X milisegundos a Bennu para que este haga sus cosas?

Erkosone

  • Hero Member
  • *****
  • Mensajes: 882
  • Karma: 51
Re:Multihilos
« Respuesta #1 en: Septiembre 03, 2012, 01:03:26 pm »
Hola TransDiv, si BennuGD se asemeja por poco que sea a Div debería estár implementado el sistema de procesos de una forma similar, no se si me voy a equivocar pero casi aseguraría que los procesos de Bennu no son threads si no mas bien son gestionados por el motor en C de BennuGD que los ejecuta por prioridad y serializados, pasando a procesar el siguiente proceso "por prioridad" una vez encontrada la sentencia "frame", eso da la apariencia de que son ejecutados en paralelo pero en realidad no es así, se ejecutan uno detrás de otro hasta llegar el ultimo process a su frame y en ese punto se actualiza el canvas o render o como quieras llamarlo.


En el caso de una DLL pasa que si no delegas las acciones que puedan tardar un tiempo en procesarse a otro thread sucede que en realidad si unas una función de esa dll desde un process cualquiera.. hasta que no se termine de ejecutar la función BennuGD no saltará a la siguiente instrucción de ese process, y por eso se bloquea el programa en bennuGD "o en cualquier otro lenguaje", una solución es que la llamada a la función externa de un 'return' para que bennugd siga haciendo sus cosas y delegar a otro hilo de ejecución el trabajo pesado que tenia que hacer esa función, así para bennugd la función ya ha hecho lo que tenia que hacer y sige ejecutando el bytecode "juego" y mientras "en otro thread" la dll está computando lo que sea necesario ;)

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12556
  • Karma: 370
Re:Multihilos
« Respuesta #2 en: Septiembre 03, 2012, 03:05:40 pm »
erkosone, no entendi eso que decis de las funciones y los returns... pero si es lo que creo que queres decir, te digo que una funcion bloquea al proceso llamador hasta el return, pero no a los demas... y un proceso no bloquea a quien lo llama...

mas alla de esto que acabo de decir, una dll si no usa threads no hay forma de que no bloquee a todos los procesos/funciones de bennugd hasta que termine su ejecucion...

transdiv, respondiendote, si, es correcto lo que dices, bennugd no implementa threads para la ejecucion de los procesos y es responsabilidad del programador de la dll implementarlos...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Transdiv

  • Full Member
  • ***
  • Mensajes: 235
  • Karma: 13
Re:Multihilos
« Respuesta #3 en: Septiembre 03, 2012, 10:28:23 pm »
Lo que le entiendo a Erkosene es que la función dentro de la DLL que es llamada desde el programa en Bennu, crea un hilo de ejecución y retorna a Bennu para que este siga ejecutandose, pero a la vez ese hilo tambien se ejecuta en paralelo y continua procesando otras cosas. Lo que si no conozco es que por ejemplo si el hilo ese quiere hacer modificaciones en una imagen o mapa creado por Bennu esto se permite (no estoy seguro si habra algun tipo de proteccion de datos dado por el SO).

Por ejemplo si creo una DLL que me genere un fractal complejo en un mapa y el algoritmo se demora 10 segundos en procesar la imagen, no quiero que el programa en Bennu se pare durante todo ese tiempo sino quiero que se vaya mostrando paulatinamente mientras se crea; Por lo que entiendo habria dos formas de hacerlo :

1 - El metodo propuesto por Erkosene en el cual el hilo creado por la funcion de la DLL llamada desde Bennu se sigue ejecutando a pesar de que la función ya retorno y esta sigue modificando el mapa adonde va a ir el fractal; Habria que ver si el SO permite este tipo de acceso aunque me imagino que si, aunque me imagino que habra que poner algun tipo de semaforo (No se si estoy hablando barbaridades aca)

2 - Modificar el algoritmo que genera el fractal para que retorne a Bennu desde la funcion en la DLL luego de que por ejemplo haber procesado durante 50 milesegundos y usando variables static guarda la posicion donde se quedo en el proceso para que cuando Bennu vuelva a ejecutar la funcion retome el proceso del algoritmo desde el punto donde se quedo la vez anterior.


Creo que voy a chequear los ejemplos en el BennuPack para ver si hay ejemplos que hagan algo de esto.

Salu2

Erkosone

  • Hero Member
  • *****
  • Mensajes: 882
  • Karma: 51
Re:Multihilos
« Respuesta #4 en: Septiembre 04, 2012, 06:48:44 am »
erkosone, no entendi eso que decis de las funciones y los returns... pero si es lo que creo que queres decir, te digo que una funcion bloquea al proceso llamador hasta el return, pero no a los demas... y un proceso no bloquea a quien lo llama...

mas alla de esto que acabo de decir, una dll si no usa threads no hay forma de que no bloquee a todos los procesos/funciones de bennugd hasta que termine su ejecucion...

transdiv, respondiendote, si, es correcto lo que dices, bennugd no implementa threads para la ejecucion de los procesos y es responsabilidad del programador de la dll implementarlos...


Lo del 'return' es una forma de hablar para que se entienda, realmente soy novato en esto de threads, es uno de los modulos de un curso que estoy haciendo de java, en unos días podré estar mejor informado  ;D


Solo era una explicación haciendo un simil con una función básica.


@TransDiv: Oye si vas a hacer una lib de fractales para un mapa.. has pensado que los fractales se pueden programar con funciones recursivas? quizá no haga falta ni threads para hacer esto, simplemente un bucle con 'n' llamadas desde bennugd a tu lib y poco a poco ir montando el fractal, claro que esto será mas lento 'o no' pero podrías ver la evolución del fractal en vivo.