Multithreading real

Esta sección esta especialmente diseñada para todos aquellos usuarios que estés desarrollando plugins o aplicaciones y quieran ayuda para dichos plugins o aplicaciones.
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???????

Imagen

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 :ohyeah: :hypno: :hypno:
Juer, esto si me interesaría para mi APP porque llevo tiempo intentando implementar el multithreading...
Yo te ayudaría pero es que en C++ suspendí el "Hello world" :lol:
Y de hecho a funcionado!

Imagen
Utilizando este codigo para el thread:
luaL_dostring(temp->m_ps, "count = 0 while 1 do count = count + 1; Dialog.Message('Count:', count);   end");


Voy a ir pulienendo este objeto para poder intercambiar codigo, funciones y variables a traves de distintos threads, que ademas comparten globales por lo que se puede usar toda la funcionalidad desde cualquier thread

gracias a webultra por sugerirme usar lua_newthread, del cual no sabia ni que existía, pero que hemos podido agregar facilmente

Ire publicando versiones de prueba por aqui, pronto tendremos consultas sql que no bloquean la aplicacion, o modificadores del GUI que permiten trabajar mientras este se actualiza, o dialogos y dialogex que no cortan el resto de la ejecucion, o la ejecucion de programas y la obtencion de sus resultados sin perjudicar el resto del funcionamiento

tiene buena pinta
Buenisimo! , sois una makinas ;)
Buff menuda maquina!!

El lua lanes me funciona bien (el ejemplo de webultra con el lfs.dll) pero como comentas me da problemas a la hora de "devolver" el codigo de la busqueda y no permite ejecutar plugins ni funciones de AMS...

Si fueras capaz de permitir que ejecute los plugins y funciones de AMS en segundo plano sin bloquear la aplicacion ... :yeah: :yeah: :yeah: :hypno: :ohyeah: :ohyeah:

Muchas gracias, a ver si puedes continuar este proyecto!
:focus: :focus: :focus: :focus: :focus: :focus: :focus: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1: :num1:
thanks

Pabloko gracias por el plugins, pero podrias subir el codigo para entender un poco mas como funciona, la verdad es que esa es la piedra que limita y mucho el ams.

Desde ya gracias.
thanks