Página 1 de 1

Ayuda con la función _Singleton()

Publicado: 14 Jun 2010, 19:26
por Jonny
Hola

Pues es una lucha de hace mucho tiempo, entre yo y la función _Singleton que implementa Autoit en la UDF "Misc", desde hace ya bastante tiempo.

Antes, para que un programa se cerrara si se intentaba ejecutar mientras se estaba ejecutando, hacía esto:

Código: Seleccionar todo

If _Singleton(@ScriptDir&"\"&@ScriptName, 1)=0 Then
Exit
EndIf
Ahora, desde hace varias versiones, no hay manera de que me funcione esta función. Por más que he leído la ayuda de esta función en las últimas versiones, no consigo que se cierre el programa si ya se está ejecutando.

Según la ayuda, debería de hacer algo como esto:

Código: Seleccionar todo

_Singleton(@ScriptDir&"\"&@ScriptName, 0)
Y se cerraría el programa, en caso de haber otro proceso del mismo, en el momento de llamar a _Singleton. Veo que pone algo de las barras invertidas (\), pero no entiendo muy bien (mi inglés no es bueno precisamente). Solo entiendo, que en el segundo parámetro dice algo de que si se van a usar las barras invertidas en el primer parámetro, es mejor fijarlo a 2, en vez de 0, pero ni con 0, ni con 2, no funciona.

¿Como va esta función?


Acias.

Salu2!

Re: Ayuda con la función _Singleton()

Publicado: 15 Jun 2010, 08:34
por Ximorro
Pues dice que no uses las barras. Eso es para usar espacios de nombres, que no me preguntes cómo se usa porque no sé mucho de eso, debe ser parecido a lo del xml, es para dar nombres a los objetos de forma estructurada.
El parámetro a 2 es para organizarse mejor con sistemas multiusuario, para crear objetos globales, por ejemplo, y se utiliza en conjunción con los espacios de nombres.

Conclusión, no uses esas barras y debería ir. Pero no uses el path del script (@ScriptDir) ¡¡porque eso también tendrá barras!!. Yo simplemente le daría un nombre a la aplicación, así de hecho aunque el usuario cambie el nombre del exe tampoco podrá tener varios en ejecución, pues internamente tienen el mismo nombre.

Con el parámetro a 0 se cerrará inmediatamente la segunda instancia del programa, con el parámetro a 1 la función retorna un 0 cuando hay otra instancia ejecutándose (así lo puedes comprobar y dar el mensaje antes de cerrar).

Básicamente es lo que estabas haciendo, pero pon como nombre "MiProgramadeCorreo", "MiIdentificadorChulisimo" y cosas así, mientras esa cadena no la use nadie más identifica a tu programa. Si usas @ScriptName puedo ejecutarlo, hacer una copia del ejecutable, cambiarle el nombre y ejecutar esta copia. Tendría dos copias de tu programa en ejecución porque tienen nombres diferentes y es lo que miras. Mejor pon un nombre fijo.

Nota: al margen, aunque en este caso no hay que usarlo, fíjate que hay otra macro llamada @ScriptFullPath, que es precisamente equivalente a @ScriptDir & "\" & @ScriptName

Re: Ayuda con la función _Singleton()

Publicado: 15 Jun 2010, 12:46
por Jonny
Hola

Vaya... Pues sí, efectivamente, funciona como dices.
Entendía que no quería las barras, pero no me explicaba como indicarle la ruta del ejecutable. No sabía lo que dices, de que aunque se le cambie el nombre al archivo, internamente tenga el mismo, por eso quería darle toda la ruta.
Sabiendo esto, pues lo hago así y ya está (tampoco entiendo muy bien el rollo ese de los espacios) jejeje.

¡Por fin, no tengo que andar sustituyendo la función cada vez que instalo el AutoIt, por la versión vieja!.

Salu2!

Re: Ayuda con la función _Singleton()

Publicado: 16 Jun 2010, 11:04
por Ximorro
Jonny escribió: No sabía lo que dices, de que aunque se le cambie el nombre al archivo, internamente tenga el mismo, por eso quería darle toda la ruta.
A ver, creo que hay una confusión, es que son cosas diferentes. Una cosa es el nombre del archivo, que obtienes con @ScriptName (o con @ScriptFullPath con toda la ruta). Eso lógicamente sí cambia si por ejemplo le cambio el nombre al exe, de ahí lo de poder ejecutar dos instancias creando dos exes del programa con nombres diferentes.

A _Singleton le pasas el nombre que quieres, no es que tenga un nombre interno, más bien es una especie de etiqueta que le pones tú arbitrariamente, voy a llamarlo identificador, para distinguirlo del nombre del archivo. Siempre que otros programas que usen este mecanismo usen otros identificadores no habrá problemas. Por otro lado programas diferentes que usen el mismo identificador interferirán. Pero por eso ya no valdrá lo de cambiar el nombre al exe, pues cada ejecución pasa el mismo identificador a Singleton y se da cuenta de que es el mismo programa...

Re: Ayuda con la función _Singleton()

Publicado: 16 Jun 2010, 15:47
por Chefito
Una pequeña explicación del tema con una rápida búsqueda un google:
http://copstone.com/2010/04/como-permit ... -programa/

Si es que google lo sabe todo!!! :smt005 :smt005 .

Saludos.

Re: Ayuda con la función _Singleton()

Publicado: 16 Jun 2010, 16:30
por Jonny
Hola

Pues, gracias a los dos, ahora ya entiendo de que va esto...

Yo ví algo en la ayuda de la función _Singleton() de "Mutex", pero me sonaba a chino .. jejejeje.

Salu2!

Re: Ayuda con la función _Singleton()

Publicado: 20 Jun 2010, 23:38
por Chefito
Aquí pongo otro enlace que será muy interesante respecto a este tema. Pertenece a las FAQ de la página oficial:
http://www.autoitscript.com/wiki/FAQ#Ho ... running.3F

Saludos.

Re: Ayuda con la función _Singleton()

Publicado: 21 Jun 2010, 10:42
por Ximorro
¡Muy buena página!

Pero ojo que puede confundir esto que en los ejemplos ponen TheNameOfMyScript y MyScriptName, que parece que haya que poner el nombre del archivo del script, que es lo que confundía a Jonny, pero no, es un nombre arbitrario que ponemos al semáforo.

Pues esa MutexExist no la conocía y también está muy bien, si no hace falta eso del sistema multiusuario (que de todas maneras no sé cómo se usaría) este es más simple y hace lo mismo.
Aunque me sorprende eso del StringReplace($cadena, "", "") ¿¿¿Eso hace algo??? :smt017 :smt017

¡Anda! ¿Habéis visto ese debugger gráfico?
http://www.autoitscript.com/wiki/FAQ#Graphical_debugger
¿Alguien lo ha usado?