none
Crear una sola instancia de la aplicacion RRS feed

  • Pregunta

  • Hola,espero q me puedan ayduar con esta pequeña duda
    Tengo una aplicacion q hace un manejo de datos y conexiones a DB sincronizadas,lo que pretendo es:
    Cuando mi aplicacion se ejecute, de ningun modo ,ni de ninguna manera puede volver a ejecutarse la aplicacion,porq esto crearia una inconcistencia y perdida de datos
    Ni volviendo a ejecutar el .exe(cuando ya este puesta en marcha) ,ni con el depurador(cuando todavia este en proceso de desarrollo)
    Como puedo hacer esto?


    Otra cosa mas, mi aplicacion esta programada para q se ejecute tooooodo el tiempo,pero ,quiero que cuando llegue la media noche(al iniciar el nuevo dia) la aplicacion se vuelva a ejecutar por si sola,como si estuviesemos iniciando la aplicacion por primera vez,como puedo hacer esto?
    miércoles, 20 de agosto de 2008 16:31

Respuestas

  • Hola Sergio.  Viniste a revivir una pregunta un tanto antigua.  La leí y el problema con tu solución es que no satisface los requerimientos mínimos que el usuario sozo requiere.  El más cercano sería Juan M Gomez, pero aún tiene algunos detallitos.

    Para satisfacer los requerimientos, debe crearse un Mutex con un nombre único tan pronto se inicia el programa.  Sozo no dice qué lenguaje es, así que la primera oración de Juan puede servir si es un proyecto VB.  Tengo entendido que esta opción hace el mutex justamente.  Si fuera C#, hay que crear el mutex en el método Main() de la clase Program.  Debe ser un Mutex con nombre, que es lo que Juan no hace.  Si es un mutex sin nombre, entonces nunca habrá conflicto.

    Para aclararte las razones de por qué tu sugerencia no es correcta, analiza este caso:  ¿Qué pasa si el ejecutable .exe se copia a otra carpeta, se renombra y se ejecuta?  En este caso GetProcessByName() fallará y no se habrá logrado el objetivo.

    Finalmente, para resolver el asunto de tiempos, recordemos que Windows tiene el Task Scheduler.  No hay que reinventar la rueda cada vez.  Simplemente es crear un item nuevo para el Task Scheduler y listo.


    Jose R. MCP

    lunes, 12 de marzo de 2012 17:52
    Moderador

Todas las respuestas

  • Muy buenas, lo primero que pides conozco dos formas de hacerlo, la primeras es:
    desde el explorador de solucione, click derecho sobre el proyecto, propiedades y chequeas la casilla que dice Convertir a aplicacion de instancia única o algo asi.
    y la segunda es en el constructor de la clase principal, pones el siguiente codigo:
    Sub New() ' Llamada necesaria para el Diseñador de Windows Forms. InitializeComponent() Dim BcreadoEstaInstancia As Boolean Dim proceso As System.Threading.Mutex = New System.Threading.Mutex(False, "/Local", BcreadoEstaInstancia) If Not BcreadoEstaInstancia Then End End If End Sub
    Lo que hace es que el booleano es pasado por referencia, y este marca que proceso o subproceso o inicio, sino fue este el creador, finaliza el proceso con la instruccion end.
    Sobre lo segundo, se me ocurre que podrias hacer un evento timer,. que cuando llegue la media noche (con los metodos de datetime) , cierre la aplicacion, y justo antes de cerrarse lla vuelva a llamar, o hacer la segunda parte con otro programa, esta opcion la veo mas factible.
    Un saludo

    miércoles, 19 de noviembre de 2008 16:29
  • Hola amigo, no sé si te servirá para este caso concreto pero para tener una sóla instancia en un momento determinado en ejecución de una clase podrías usar los patrones singleton.

    Saludos.
    Francisco J.
    jueves, 20 de noviembre de 2008 11:41
  • Saludos.

    puedes obtener la istancia que se esta ejecutando y controlarla, por medio de la clase Process, esta contiene un metodo llamado GetProcessByName("programa.exe"). 

    encuentra mas info en este enlace.  Clase Process

    para que se ejecute programado, debes crear un componente y registrarlo como servicio en windows.

    http://blogs.msdn.com/b/mvplead/archive/2008/02/20/c-mo-hacer-un-servicio-windows-en-c.aspx


    Sergio Vargas [BogotaDotNet] MCTS(ASP.NET , ADO.NET WINFORMS)

    lunes, 12 de marzo de 2012 16:31
  • Hola Sergio.  Viniste a revivir una pregunta un tanto antigua.  La leí y el problema con tu solución es que no satisface los requerimientos mínimos que el usuario sozo requiere.  El más cercano sería Juan M Gomez, pero aún tiene algunos detallitos.

    Para satisfacer los requerimientos, debe crearse un Mutex con un nombre único tan pronto se inicia el programa.  Sozo no dice qué lenguaje es, así que la primera oración de Juan puede servir si es un proyecto VB.  Tengo entendido que esta opción hace el mutex justamente.  Si fuera C#, hay que crear el mutex en el método Main() de la clase Program.  Debe ser un Mutex con nombre, que es lo que Juan no hace.  Si es un mutex sin nombre, entonces nunca habrá conflicto.

    Para aclararte las razones de por qué tu sugerencia no es correcta, analiza este caso:  ¿Qué pasa si el ejecutable .exe se copia a otra carpeta, se renombra y se ejecuta?  En este caso GetProcessByName() fallará y no se habrá logrado el objetivo.

    Finalmente, para resolver el asunto de tiempos, recordemos que Windows tiene el Task Scheduler.  No hay que reinventar la rueda cada vez.  Simplemente es crear un item nuevo para el Task Scheduler y listo.


    Jose R. MCP

    lunes, 12 de marzo de 2012 17:52
    Moderador