Cómo remplazar un programa en ejecución?

User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Cómo remplazar un programa en ejecución?

Post 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
Saludos,

Adhemar C.
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

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

Post by Armando »

Adhemar:

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

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

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

Post 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
Saludos,

Adhemar C.
User avatar
Patricio Avalos Aguirre
Posts: 1028
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile
Contact:

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

Post 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..
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

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

Post by acuellar »

Gracias distinguido.

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

Saludos

Adhemar
Saludos,

Adhemar C.
User avatar
Patricio Avalos Aguirre
Posts: 1028
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile
Contact:

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

Post 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 :-)
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

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

Post by acuellar »

Gracias, muy buena idea lo del .ini, asi lo haré.

saludos

Adhemar
Saludos,

Adhemar C.
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

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

Post 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
User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

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

Post by acuellar »

Distinguido gracias por su aporte. Muy buena idea.

Hay que ponerlo en práctica.

Saludos

Adhemar
Saludos,

Adhemar C.
User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

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

Post 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
Saludos,

Adhemar C.
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

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

Post 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)
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
Ramon Paredes
Posts: 215
Joined: Fri Feb 02, 2007 3:38 pm
Location: Managua, Nicaragua

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

Post 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
... Desde la Tierra de lagos y Volcanes......
User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

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

Post by acuellar »

Gracias, Ramon

No lo habia tomado en cuenta.

Saludos desde Santa Cruz de la Sierra

Adhemar Cuellar
Saludos,

Adhemar C.
User avatar
Alfredo Arteaga
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico
Contact:

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

Post 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)
User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

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

Post 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
Saludos,

Adhemar C.
Post Reply