5 de julio de 2009

Conocer si tu aplicación ya está en ejecución

He visto algunos ejemplos usando la API de Windows para determinar si tu aplicación ya está en ejecución. Muchos de esos ejemplos utilizan el "caption" de una ventana y con ello puedes tomar acciones en cuanto a permitir la ejecución simultánea de varias instancias o no.

En lugar de permitir varias instancias, mejor permítele hacer varias tareas a la vez dentro de la aplicación.

El ejemplo que les expongo hace uso de WMI de Windows y es bastante sencillo.

En esencia es una consulta sql que nos devuelve los nombres de los procesos que están en ejecución. He dejado los comentarios para explicar que en mi caso muy particular, yo pregunto si la cantidad de procesos es mayor que o igual a 3 (y usando un like en el sql) porque hago uso de dos programas: uno que será el "launcher" el cual buscará el ejecutable compilado más reciente y éste será el que se ejecute (Así no tengo que interrumpir las labores de otros usuarios cuando tenga que hacer alguna correción en otras pantallas)

FUNCTION MyProcessName  
 *.* Determina si el programa de recibo bodega ya está en ejecución.
 *.* De ser así, devuelve un valor lógico que será usado para terminar o continuar con el programa.
 *-* Se debe tomar en cuenta que ReciboBodega es ejecutado usando dos programas: 
 *-* recibo_bodega.exe y recibo_bodegannn.exe
 LOCAL lcComputer as String

 lcComputer = '.'
 loWMIService = Getobject('winmgmts:'+'{impersonationLevel=impersonate}!\\' + lcComputer + '\root\cimv2')
 colProcessList = loWMIService.ExecQuery('Select * from Win32_Process where name like "recibo_bodega%"')
 IF colProcessList.count>=3
  RETURN .T.
 ELSE
  RETURN .F. 
 ENDIF 
ENDFUNC 

Pero en su caso puede preguntar directamente por el nombre de su ejecutable y cuando "count" sea igual a uno, su función regresará un valor Cierto.

Por último, en el su prg principal, en sus primeras líneas deberás poner:

IF MyProcessName()
   RETURN .F.
ENDIF  

Saludos,

Jorge Luis Vejerano, Panamá

1 comentario :