Ejecutar una función varias veces a la vez.

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Ejecutar una función varias veces a la vez.

Mensaje por arkcrew »

Hola a todos,

Me he encontrado con esta duda a la hora de intentar mejorar un poco una aplicación que levo desarrollando ya varios años, espero expresarme con toda la claridad que me sea posible y ejemplificaros al máximo para que me podáis ayudar si podéis.

Bien en primer lugar, me gustaría saber si puedo ejecutar una función varias veces al mismo tiempo e ir trabajando con sus resultados sobre la marcha, es decir, supongamos que:

Tengo 200 licencias de una cosa y quiero validarlas de 4 en 4, por poner un ejemplo. Tengo una función que valida usuario y clave y devuelve true o false en caso de que sea válida o no.

Lo que quiero saber es si puedo hacer algo para que el programa trabaje la función con cuatro licencias a la vez o más, y que valide al mismo tiempo esas licencias y en cuanto una de esas cuatro sea válida devuelva true.

Espero haber expresado bien esa primera parte.

Más dudas


Supongamos una aplicación que tiene definido un TrayCreateItem() asociado a TrayItemSetOnEvent() con una función.

¿Existe alguna manera de que si yo pulso en cualquier momento de la ejecución del programa ya sea mientras está ejecutando otra función, hacer que le programa reconozca que has pulsado ahí y ejecute la función a la que está asociada?

Son cosas que por ejemplo en C++ puedes hacer pero no se la estructura en autoit, o si es posible siquiera.

Mi última pregunta es la siguiente, también reaccionado con varios procesos simultáneos dentro de una aplicación:

Supongamos un programa que se ejecuta normal, tenemos la función que cambia el icono, pues por ejemplo, supongamos, quizás todos habréis visto el icono del avast en movimiento, pues supongamos algo así, habría que generar un subproceso que paralelamente a la ejecución del programa esté cambiando el icono de nuestra aplicación no?

¿Es eso posible en autoit?

Gracias a todos de antemano, espero que me haya explicado con claridad y espero también que podáis aportar algo de información en cuanto a estos aspectos ya que me interesan mucho y bueno, todo viene a que pensé que si había funciones que generaban descargas paralelas, supongo que quizás se pueda hacer lo que yo digo.

Espero algunas respuestas!

Saludos!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Ejecutar una función varias veces a la vez.

Mensaje por Ximorro »

¡Buenas!

AutoIt no es multihilo así que realmente lo que quieres no se puede hacer consiguiendo un incremento de rendimiento, no en un solo programa.
Si buscas información de autoit multiproceso, multihilo o multithreading encontrarás algunas cosas, pero piensa que sólo se consigue simular, en realidad el programa se ejecuta de manera secuencial.

Por ejemplo se puede simular con las funciones Adlib, que ejecutan una función cada cierto tiempo, ¡pero en realidad interrumpen el programa donde estaba para ejecutar la función! ¡no la ejecuta en paralelo!.

Hay funciones que sí trabajan en background, como InetGet con el cuarto parámetro a 1, pero para eso ya deben haberse diseñado así internamente en AutoIt (que está programado en C), pero nuestras propias funciones AutoIt no pueden hacerlo.

La verdadera multitarea se puede hacer ejecutando otros programas (que pueden ser varias ejecuciones de nuestro mismo programa) con ShellExecute o Run, por ejemplo.
Así que una manera, no muy eficiente me temo, es ejecutar el programa varias veces, y que cada ejecución se encargue de una serie de licencias.
Hombre, si son por ejemplo 2000 y haces cuatro ejecuciones para que cada una mire 500 igual sí que compensa el trabajo...
Claro que luego hay que comunicarlos, una manera sería hacer un programa lanzador diferente de los que hacen el trabajo. Los puede lanzar pasándoles por parámetros de entrada lo que tienen que hacer, y los programas podrían escribir los resultados en archivos de texto, que el programa lanzador recopilaría para tomar todas las soluciones...

Hombre, hay otros trucos para conseguir multitarea, pero son cada vez más complicados, por ejemplo hacer una función en C en una DLL que llamamos de AutoIT, la DLL crea un thread que hará el trabajo y retorna enseguida a AutoIt. Ese thread sí se ejecutará paralelamente al programa autoit... pero está escrito en otro lenguaje, además sería un poco complicado recoger el resultado, pues la función retorna antes de que el proceso esté terminado.

Lo del icono en AutoIt probablemente lo mejor sea haciéndolo con una función Adlib, como comento eso hará el programa un poco más lento pues es interrumpido, pero no creo que se note mucho si lo cambias 3 ó 4 veces por segundo, por ejemplo.
Lo que no sé es si se pueden tener iconos animados tipo GIF, eso sería ideal porque no habría que hacer nada, se pone y ya se anima sólo, pero realmente no sé si un ICO tiene esa capacidad...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Ejecutar una función varias veces a la vez.

Mensaje por BasicOs »

También puedes crear ejecutables por cada función y ejecutar cada función como ejecutable, y devolver los valores escribiendo en disco o en variables del sistema.
Otro sistema es hacer un pool o cola, en que los subprocesos (subsubfunciones) de cada función se van gestionando y priorizando con algún criterio, es simplemente hacer colas y gestionarlas con un puntero y unas variables... :smt023
Salu22:)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Ejecutar una función varias veces a la vez.

Mensaje por arkcrew »

Hola,

En primer lugar, daros las gracias a ambos, ¡Así da gusto leer un tema!, me habeis aclarado y aportado bastantes cosas, lo del multithreading o como se escriba, el multiproceso lo lei ya n el foo de autoit inglés, para que nodigais que no me informo primero, al igual que el adlib, pero gracias a la explicación de Ximorro creo haber entendido al fin como funciona, y me parece muy interesante, ahora por ejemplo puedo ejecutar una función pero al tener un adlib esa función se pausa ejecuta una y prosigue con la anterior y para algunas cosas me va a ser ultil.

Lo de ejecutar una aplicación, leí que se hacía mediante los a3x y de hecho voy a probarlo a ver que tal por si puedo en alguna manera incrementar el rendimiento de mi aplicación.

Lo del icono, yo pensé en un guif animado pero me da que va a ser que no jajajaja, en realidad es un poco chorrada y puedo prescindir, pero con un adlib se podría hacer, esta misma tarde pienso informarme al máximo de como funciona bien y a ver que consigo!

También es cuestionable la idea de un ejecutable por función, pero hasta cierto punto, ya tuve malas experiencias con eso, primero el ejecutable se engordaba un poco y segundo a veces no devolvía los parámetros o se liaba (quizás mi código fuera erróneo quién sabe) así que esa opción la desecho, pero muchas gracias igualmente por el aporte BasicOs, para las licencias si que es mejor un a3x

Saludos! y de nuevo, muchísimas gracias!!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Ejecutar una función varias veces a la vez.

Mensaje por Jonny »

Como dice Ximorro, AutoIt no es multihilo, así, que poderse, no se puede (que sí se puede) ;). Pero es como él dice, simularlo, no hacerlo realmente.

Como he dicho otras veces que hemos hablado de multihilo, a mi la forma que más me gusta, y la que más parece que sea multihilo, es con timers de Windows. Son timers, pero ejecutándolos cada 0 segundos pueden parecer hilos. Eso sí, según lo que haga cada función que asocies a los timers, la cpu puede servir pa freir un huevo :P.

La otra forma que plantea Ximorro de tirar de C, y escribir una dll, me gusta todavía más. De hecho, hace ya un tiempo me rondaba por la cabeza esa idea, pero complicándome bastante la vida, porque la idea era una dll genérica, para tratar los hilos de una forma muy genérica. Vaya, como si fueran nativos de AutoIt: Crear tantos como se quisiera, pausarlos, reanudarlos... El único problema de aquello, era el que la dll permitiera crear tantos hilos como se quisiera, sin límite, sin conocer los hilos que se gestionaban... No debe ser muy difícil, pero no tengo tanto nivel de C como para meterme a ello. Básicamente, necesitaba crear una función que admitiera una cantidad desconocida de parámetros. En una llamada podían ser dos, en otra uno... Así es como se me ocurrió que podría montar la dll, aunque ahora no sabría explicar cien por cien como la planteé, pues ya digo que hace tiempo. Pero lo de la función con una lista variable de argumentos de entrada, era lo que me hizo olvidar la idea.
Pero sería genial, crear una dll que permitiera tratar hilos en autoit.

Yo creo que iría bien, si el thread de la dll invoca un callback de AutoIt. Vaya, que sería muy parecido a los timers de Windows, pero con apis de threads, que con C sí pueden tratarse bien.

Por cierto, hace unos meses colgué por aquí una librería hecha en autoit, que decía tratar bien los hilos... Yo probé los ejemplos que llevaba y no recuerdo que funcionara mal, pero no eran ejemplos muy complejos, dónde usaran interfaces, bucles etc etc. Pero no conseguí entender el código, sólo se que usaba las apis thread, que tantas veces se ha intentado usar en AutoIt, sin éxito...

Para estas cosas, Autoit+C++ es para mi la mejor convinación ;).

Salu2!
Responder