Hola compañeros, he estado dandome una vuelta por el mundo multithreading para ams, y no hay realmente nada que me convenza, me explico:
-Metodo coroutine: por ejemplo http://www.lua.org/pil/9.4.html este metodo usa un solo lua state, para si o si la ejecucion de una de las dos partes, requiere saber lo que se esta haciendo y cuidar muchisimo la programación, solo vale para cosas recursivas de muchas veces que toman poco tiempo.
-Metodo lanes: no me queda claro si inicia varias lua state, pero me figuro que no, a grandes rasgos lo que creo que hace es secuenciar la pila de lua (el stack) e ir intercalandolo, esto puede estar muy bien, pero la integracion no es muy buena, no tiene mucho soporte, el proyecto esta casi muerto y da problemas serios de inyeccion de datos en los diferentes threads, siendo un poco caotico y dificultoso de programar.
Mi idea/solución para esto.
En una aplicación AMS disponemos de las librerias de lua, tanto para ser usadas por nuestra aplicacion, como para que tambien las pueda utilizar un plugin...
Y digo yo, no podria crear un plugin que gestione un multithreading con c++/mfc, que este cree threads, que estos a su vez creen un lua state, y que se le registren funciones para el intercambio de datos, para que todo ello interactúe con el programa principal y su lua state en el que tambien registro las funciones de intercambio???????

hmmmmmm, un poco caotico, pero con cierto sentido... segun podemos leer en: http://msdn.microsoft.com/en-us/library ... 80%29.aspx
como creo que debe hacerse:
-Crear un object plugin, por ejemplo basado en ObjectWindowless
-Como ya va vinculado a lua dinamicamente, solamente hay que crear diferentes lua_states, vamos a definir un numero de 10
-una vez creados nuestro 10 lua_states, ademas de nuestro propio lua_state de la aplicacion registramos en todos las funciones lua de intercambio, pudiendo ser, interop.var(namevar,datavar) y similares
-Creamos 10 eventos para nuestro objecto, estos 10 eventos recibiran información cuando una de nuestras funciones anteriormente registradas sean llamadas desde el respectivo lua_state
funciones requeridas,
lazar codigo/variable/funcion(lua_state, contenido)
lanzar evento(lua_state, variable/codigo/funcion)
Problemas conocidos... al usar diferente lua_state, obviamente, lo que esta en uno no esta en otro, es decir, en cada thread, no disiponemos de las funciones de ams, tampoco de los plugins que tengamos cargados, solo disponemos de una maquina lua en blanco en la que tenemos que configurar un entorno para trabajar, aunque claro podemos cargarle plugins lua con el require, o de ams con loadlib hacia la funcion de creacion de librerias
Parece un tocho, pero he podido sentar las bases con una simple prueba que os subo en video, apenas 20 lineas de codigo sobre el ObjectWindowless y ya tenemos multithread por mfc funcionando, hora de crear mas lua_states e implementar las funciones de conexion entre lua_states, con esto ya disponemos de una primera integración basica y funcional para miltithreading REAL, cool he?
CERVEZAAAAAA
-Metodo coroutine: por ejemplo http://www.lua.org/pil/9.4.html este metodo usa un solo lua state, para si o si la ejecucion de una de las dos partes, requiere saber lo que se esta haciendo y cuidar muchisimo la programación, solo vale para cosas recursivas de muchas veces que toman poco tiempo.
-Metodo lanes: no me queda claro si inicia varias lua state, pero me figuro que no, a grandes rasgos lo que creo que hace es secuenciar la pila de lua (el stack) e ir intercalandolo, esto puede estar muy bien, pero la integracion no es muy buena, no tiene mucho soporte, el proyecto esta casi muerto y da problemas serios de inyeccion de datos en los diferentes threads, siendo un poco caotico y dificultoso de programar.
Mi idea/solución para esto.
En una aplicación AMS disponemos de las librerias de lua, tanto para ser usadas por nuestra aplicacion, como para que tambien las pueda utilizar un plugin...
Y digo yo, no podria crear un plugin que gestione un multithreading con c++/mfc, que este cree threads, que estos a su vez creen un lua state, y que se le registren funciones para el intercambio de datos, para que todo ello interactúe con el programa principal y su lua state en el que tambien registro las funciones de intercambio???????

hmmmmmm, un poco caotico, pero con cierto sentido... segun podemos leer en: http://msdn.microsoft.com/en-us/library ... 80%29.aspx
como creo que debe hacerse:
-Crear un object plugin, por ejemplo basado en ObjectWindowless
-Como ya va vinculado a lua dinamicamente, solamente hay que crear diferentes lua_states, vamos a definir un numero de 10
-una vez creados nuestro 10 lua_states, ademas de nuestro propio lua_state de la aplicacion registramos en todos las funciones lua de intercambio, pudiendo ser, interop.var(namevar,datavar) y similares
-Creamos 10 eventos para nuestro objecto, estos 10 eventos recibiran información cuando una de nuestras funciones anteriormente registradas sean llamadas desde el respectivo lua_state
funciones requeridas,
lazar codigo/variable/funcion(lua_state, contenido)
lanzar evento(lua_state, variable/codigo/funcion)
Problemas conocidos... al usar diferente lua_state, obviamente, lo que esta en uno no esta en otro, es decir, en cada thread, no disiponemos de las funciones de ams, tampoco de los plugins que tengamos cargados, solo disponemos de una maquina lua en blanco en la que tenemos que configurar un entorno para trabajar, aunque claro podemos cargarle plugins lua con el require, o de ams con loadlib hacia la funcion de creacion de librerias
Parece un tocho, pero he podido sentar las bases con una simple prueba que os subo en video, apenas 20 lineas de codigo sobre el ObjectWindowless y ya tenemos multithread por mfc funcionando, hora de crear mas lua_states e implementar las funciones de conexion entre lua_states, con esto ya disponemos de una primera integración basica y funcional para miltithreading REAL, cool he?
CERVEZAAAAAA


