Page 1 of 2

Cómo remplazar un programa en ejecución?

Posted: Wed Mar 18, 2009 6:58 pm
by acuellar
Hola

Alguien me puede decir como remplazar un programa que algún usuario en la red lo esta utilizando.

A veces se hacen algunas mejoras y se tiene que hacer salir a todos, para poder remplazarlo.

Antes con 16Bits, no habia este problema.

GRACIAS POR SU COLABORACION

Saludos

Adhemar

Re: Cómo remplazar un programa en ejecución?

Posted: Wed Mar 18, 2009 7:27 pm
by Armando
Adhemar:

En 32 bits no he tenido problemas así como tu lo haces.

Saludos

Re: Cómo remplazar un programa en ejecución?

Posted: Wed Mar 18, 2009 7:36 pm
by acuellar
A mi no me deja, copiar el nuevo. Sale un error que dice.
Esta siendo usado por un usuario u otro programa

y eso que la unidad donde se encuentra el programa esta mapeada como unidad de red.

Gracias nuevamente

Re: Cómo remplazar un programa en ejecución?

Posted: Wed Mar 18, 2009 7:47 pm
by Patricio Avalos Aguirre
Hola

Para eso necesitas que tu aplicacion este en los pc, y no en el server, solo los datos deben estar en servidor

lo que hago cuando hay una actualización es dejar el nuevo ejecutable en la red y un archivo ini que es la version
al comparar la version si son iguales entra al sistema, de lo contrario llama a otra aplicacion y actualiza el EXE

espero que te sirva..

Re: Cómo remplazar un programa en ejecución?

Posted: Wed Mar 18, 2009 8:33 pm
by acuellar
Gracias distinguido.

Teniendo el ejecutable en las Pc's hace que los procesos sean más rápido?

Saludos

Adhemar

Re: Cómo remplazar un programa en ejecución?

Posted: Wed Mar 18, 2009 9:10 pm
by Patricio Avalos Aguirre
claro que si, solo los datos viajan por la red no el ejecutable que pesa mas de 2MB, el que tengo yo ya pesa 4.5 MB :-)

Re: Cómo remplazar un programa en ejecución?

Posted: Wed Mar 18, 2009 9:27 pm
by acuellar
Gracias, muy buena idea lo del .ini, asi lo haré.

saludos

Adhemar

Re: Cómo remplazar un programa en ejecución?

Posted: Thu Mar 19, 2009 11:29 am
by hmpaquito
hola a todos,

vamos a ver ...
a mi me gusta mas la idea de tener un solo ejecutable en el server... el programa se carga una sola vez al principio asi que no debe haber mucha ventaja con ponerlo en local...pero si mucha desventaja con saber si se actualizaron o no las terminales... vamos que ante cualquier problema o error no estamos 100% seguros de que la terminal tenga la ultima version...

Lo que yo haria seria algo asi... no lo tengo hecho pero siempre lo he tenido en mente, esta en un seudocodigo....

Al inicio del programa, y justo al inicio
// Siendo nuevo.exe la nueva version y anterior.exe la anterior version
FUNCTION Main()
IF EXENAME() != "NUEVO.EXE"
IF File(Nuevo.Exe)
IF DATE(NUEVO.EXE) > DATE(ANTERIOR.EXE)
winexec("NUEVO.EXE") // Äqui se añadirian los posibles parametros de entrada a main()
QUIT
ELSE
// _ LA VERSION NUEVA PQ YA ESTA ACTUALIZADO
DELETE FILE NUEVO.EXE
ENDIF
ENDIF
ELSE
// ESTAMOS EJECUTANDO LA VERSION DE NUEVO.EXE
DELETE FILE ANTERIOR.EXE // EN ALGUN MOMENTO SE BORRARA EL ANTERIOR CUANDO TODO EL MUNDO
COPY NUEVO.EXE ANTERIOR.EXE // haya SALIDO DEL PROGRAMA ANTERIOR.EXE
ENDIF
...................................................
resto programa
...................................................


El sistema se basa en:
1º winexec()
2ª la actualizacion se va haciendo progresivamente en los terminales segun vayan saliendo y entrando


saludos

Re: Cómo remplazar un programa en ejecución?

Posted: Thu Mar 19, 2009 12:00 pm
by acuellar
Distinguido gracias por su aporte. Muy buena idea.

Hay que ponerlo en práctica.

Saludos

Adhemar

Re: Cómo remplazar un programa en ejecución?

Posted: Thu Mar 19, 2009 12:18 pm
by acuellar
La comparacion de DATE(NUEVO.EXE) > DATE(ANTERIOR.EXE) no funciona.

Es asi como se debe comparar si un programas es mas nuevo?

Saludos

Adhemar

Re: Cómo remplazar un programa en ejecución?

Posted: Thu Mar 19, 2009 12:52 pm
by Daniel Garcia-Gil
Saludos Acuellar

dale una vista a el blog de biel, especificamente en este tema, esta muy bien pensado.... te pordia servir mucho para lo que quieres y creo es facil adaptarlo a lo que necesitas

http://bielsys.blogspot.com/2009/02/act ... ca-de.html
(biel no habia tenido la oportunidad de agradecerte el aporte, muy interesante y de hecho lo uso en una aplicacion)

Re: Cómo remplazar un programa en ejecución?

Posted: Thu Mar 19, 2009 4:10 pm
by Ramon Paredes
Adhemar,

Si buscas algo sencillo solo haz lo siguiente : Renombra el ejecutable que estan utilizando y copias la actualizacion, eso es todo, cuando los usuarios cierren el programa y entren de nuevo ya estan actualizados y no necesitas sacar a nadie del trabajo en proceso.

Saludos desde Managua, Nicaragua,

Ramon Paredes

Re: Cómo remplazar un programa en ejecución?

Posted: Thu Mar 19, 2009 4:21 pm
by acuellar
Gracias, Ramon

No lo habia tomado en cuenta.

Saludos desde Santa Cruz de la Sierra

Adhemar Cuellar

Re: Cómo remplazar un programa en ejecución?

Posted: Thu Mar 19, 2009 4:40 pm
by Alfredo Arteaga
He aqui las funciones que tengo en uso:

Al instalar el sistema en las terminales se mejora bastante el tiempo de respuesta y se evitan fallas por carga de Dlls y transferencia; entre otras.

Code: Select all

STAT FUNC Chk_Update()          // Verifica actualizaciones
   LOCAL cOld, cNew, aOld, aNew
   LOCAL cIni, cDir, cDat, aDrv
   IF Left(CurDir(),1)<>"\"
      cDir:=CurDrive()+":\"+CurDir()+"\"
   ELSE
      cDir:="\"+CurDir()+"\"
   ENDIF
   cIni:=GetWinDir()+"\"+cNSys+".Ini"           // Path en INI
   cDat:=GetPvProfString(cNSys,"DirDat","",cIni)
   cDir:=Lower(cDir)           // Local
   cDat:=Lower(cDat)           // Servidor
   IF !Empty(cDat) .AND. cDir<>cDat
      CursorWait()
      IF File("RC-Update.Exe")
         cOld:=cDir+"RC-eXtended.Exe"
         cNew:=cDat+"RC-eXtended.Exe"
         IF !File(cNew)
            aDrv:=ADrives()  // Abre unidades disponibles (por si acaso)
         ENDIF
         IF File(cNew)
            aOld:=Directory(cOld)
            aNew:=Directory(cNew)
            IF aOld[1,3]<aNew[1,3] .OR. (aOld[1,3]=aNew[1,3] .AND. aOld[1,4]<>aNew[1,4])
               CursorWait()
               WinExec("RC-Update.Exe")
               QUIT
            ENDIF
         ELSE
            MsgAlert("La ruta de trabajo no esta disponible.","Precaución!")
            QUIT
         ENDIF
      ENDIF
   ENDIF
RETURN (NIL)

#Include "FiveWin.Ch"

FUNCTION RC_Update()      // Copia actualización
   LOCAL cIni, cDir, cDat
   LOCAL cOld, cNew
   LOCAL cNSys
   CursorWait()
   cNSys:="RC-eXtended"
   IF Left(CurDir(),1)<>"\"
      cDir:=CurDrive()+":\"+CurDir()+"\"
   ELSE
      cDir:="\"+CurDir()+"\"
   ENDIF
   cIni:=GetWinDir()+"\"+cNSys+".Ini"
   cDat:=GetPvProfString(cNSys,"DirDat","",cIni)
   cOld:=cDir+"RC-eXtended.Exe"
   cNew:=cDat+"RC-eXtended.Exe"
   SysWait(1)
   IF File(cNew)
      FErase(cOld)
      CursorWait()
      CopyFile(cNew,cOld,.F.)
   ENDIF
   WinExec(cOld)
   QUIT
RETURN (NIL)

Re: Cómo remplazar un programa en ejecución?

Posted: Thu Mar 19, 2009 7:49 pm
by acuellar
Hola a todos

Logré hacer funcionar de esta forma

Code: Select all

    * FACTURAn.EXE El Nuevo
  * FACTURAa.EXE El Anterior
  
 aExeOn:=UPPER(AllTrim(SUBS(EXENAME(),AT("FACTURAn",EXENAME()),15)))
   IF aExeOn != "FACTURAn.EXE"
    
     IF File("FACTURAn.Exe")
       nHora:=FILETIME("FACTURAn.EXE"); aHora:=FILETIME("FACTURAa.EXE")
       vFecN:=dToS(FILEDATE("FACTURAn.EXE"))+Left(nHora,2)+Subs(nHora,4,2)+Right(nHora,2)
       vFecA:=dToS(FILEDATE("FACTURAa.EXE"))+Left(aHora,2)+Subs(aHora,4,2)+Right(aHora,2)
       
       IF vFecN > vFecA
         winexec("FACTURAn.EXE") 
         Quit
        ELSE
          DELETE FILE FACTURAn.EXE
        ENDIF
      ENDIF 
   ELSE
       RENAME FACTURAa.EXE TO FACTURAx.EXE
       COPY FILE FACTURAn.EXE To FACTURAa.EXE
       DELETE FILE FACTURAx.EXE        
   ENDIF
 
Con un solo ejecutable. También se podría aplicar estando el ejecutable en las terminales como el Ejemplo de Armando.
Por si a alguién lo necesita.

Saludos

Adhemar