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