Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Coptroner on October 09, 2013, 08:04:15 PM

Title: Ejecutar un programa sólo una vez
Post by: Coptroner on October 09, 2013, 08:04:15 PM
Una cosa que no me acuerdo de como se hace, a ver si me podeis refrescar la memoria... ¿que instrucción se usa para que no se pueda ejecutar mas de una instancia del interprete a la vez?  (http://foro.bennugd.org/Smileys/default/huh.gif)
Quiero que, una vez abierto un programa, no se pueda abrir otro igual hasta cerrar el primero.

Gracias!
Title: Re:Ejecutar un programa sólo una vez
Post by: SplinterGU on October 09, 2013, 10:02:08 PM
desde bennugd, actualmente no se puede...
Title: Re:Ejecutar un programa sólo una vez
Post by: Yawin on October 10, 2013, 09:53:13 AM
Pero podrías hacer que cuando se abra el programa, genere en la carpeta de temporales un archivo que elimine al cerrarse. Y que si ese archivo ya existe no quiera abrirse. Por ejemplo.
Title: Re:Ejecutar un programa sólo una vez
Post by: SplinterGU on October 10, 2013, 12:34:46 PM
eso no sirve... si la aplicacion muere, apagan la maquina, etc queda el archivo... por eso dije que actualmente no se puede...

hay muchas forma de hacerlo desde otros lenguajes, pero desde bennugd no hay por ahora.
Title: Re:Ejecutar un programa sólo una vez
Post by: warrior_rockk on October 10, 2013, 07:13:55 PM
Se podría hacer que las instancias se "comunicaran" entre si para pedir permiso de ejecución mediante ese archivo que mencionáis. La segunda instancia pide "permiso" para ejecutarse cambiando un valor del archivo. Si existe otra instancia que se ha ejecutado antes, lee esa petición y la deniega, y así la otra instancia muere. Si se hubiera apagado el PC o no existiera ninguna instancia previa, tras un "timeout" de no recibir respuesta de permiso, se daría el permiso a la instancia automáticamente.
Title: Re:Ejecutar un programa sólo una vez
Post by: SplinterGU on October 10, 2013, 07:55:46 PM
implementar toda la comunicacion es mas complicado...

puedes usar un socket y ver si ya esta abierto, pero ahi corres el riesgo que otra aplicacion este usando ese socket... lo mejor es usar semaforos nominados, y ver si ya existen al ejecutar una instancia nueva... cuando la instancia muere el semaforo tambien...

repito, actualmente no se puede hacer con bennugd.
Title: Re:Ejecutar un programa sólo una vez
Post by: Erkosone on October 11, 2013, 04:14:04 AM
Usa una variable de entorno, no ensucias el disco y hace lo mismo, si es en windows mirate el comando 'SET', puede que te sirva.
Title: Re:Ejecutar un programa sólo una vez
Post by: SplinterGU on October 11, 2013, 04:14:31 PM
nop, las variables de entorno son de tu entorno... otra terminal, otras variables.... no sirve eso.

en android creo que si te sirve, pero en PC no va...
Title: Re:Ejecutar un programa sólo una vez
Post by: Coptroner on October 12, 2013, 01:36:52 PM
Entonces estaba yo confundido... ???

Recuerdo algo muy vagamente en los comandos para ejecutar el bgdi, al igual que podemos arrancar una aplicacion con o sin acceso a la consola de comandos, pero a lo mejor lo he soñado yo esto o era cosa de Fenix... jajajaja

Igualmente gracias por vuestras respuestas  ;D
Title: Re:Ejecutar un programa sólo una vez
Post by: warrior_rockk on October 13, 2013, 09:36:05 AM
SplinterGu, creo que Erkosone se refiere a las variables de entorno del SO, en el ejemplo del SET, a las del entorno Windows. Creo que sería una buena solución. Esas variables temporales de entorno desaparecen al apagar la maquina, y las instancias las pueden consultar/eliminar.
Title: Re:Ejecutar un programa sólo una vez
Post by: SplinterGU on October 13, 2013, 03:52:50 PM
Quote from: warrior_rockk on October 13, 2013, 09:36:05 AM
SplinterGu, creo que Erkosone se refiere a las variables de entorno del SO, en el ejemplo del SET, a las del entorno Windows. Creo que sería una buena solución. Esas variables temporales de entorno desaparecen al apagar la maquina, y las instancias las pueden consultar/eliminar.

repito nuevamente, las variables de entorno que seteas con SET solo afectan a tu instancia, no son globales.

si desde tu instancia seteas variables y lanzas desde la misma instancia otro ejecutable si se ven... pero si haces un SET desde una aplicacion, ese SET no afecta a otras aplicaciones....
Title: Re:Ejecutar un programa sólo una vez
Post by: kim-elet-o on October 13, 2013, 08:44:32 PM
Hmmmm, en linux se podria comprobar con el comando ps si se esta ejecutando el proceso/instancia del juego, no lo he probado pero me parece que como se ejecuta es el intreprete de bennu deberia salir algo como bgdi, y siempre y cuando no se corriera otro juego/aplicacion bennu a la vez.
Title: Re:Ejecutar un programa sólo una vez
Post by: SplinterGU on October 13, 2013, 09:43:28 PM
todos los metodos por nombre de ventana, nombre de ejecutable y demas, no son 100% efectivos, porque alguien podria crear una aplicacion con el mismo titulo de ventana o mismo nombre de binario y no funcionaria el metodo... ni que decir si se busca por parte de la string (como ser un ps -ef|grep nombre).
Title: Re:Ejecutar un programa sólo una vez
Post by: Drumpi on October 24, 2013, 11:16:04 AM
Bueno, pero si por línea de comandos se puede hacer, basta con generar un .bat o un .sh que al invocar al BGDI se haga con el parámetro o el comando de sistema adecuado. Sólo hay que tener cuidado de que el usuario no ejecute directamente el BGDI (fácil si se evitan todas las formas de autoejecución, como el renombrar el BGDI, poner el nombre genérico a dcb, etc...), cosa imposible si ya se ha asociado los dcb a los bcd, pero ¿quién ha hecho eso hasta ahora? XD

Si no, al módulo de exec habría que añadirle dicha funcionalidad. Creo que es el único módulo sistema-dependiente ¿no?