FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour programa colgado en memoria
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
programa colgado en memoria
Posted: Thu Feb 16, 2012 04:24 PM
hola foro,

pues tengo un gran problema,
desde hace 1 semana aproximadamente y de ahi en adelante, despues de hacer varios cambios al sistema, detecte que mi .exe se queda en memoria (procesos) colgado como de 5 a 15 segundos, cosa que antes no hacia y lo peor, de pronto me empezo a enviar al cerrar el programa este error y no se de que es, adjunto imagen




no he cambiado de version de sistema operativo windows, no he cambiado de version ni actualizado nada del software que uso para el desarrollo, fwh1103, xharbour, tmysql y las lib de mysql, ni version de mysql..... bajo windows 7 pro
unicamente cambios a mis .prg y recompilar...
alguna pista???
gracias
paco
____________________

Paco
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: programa colgado en memoria
Posted: Thu Feb 16, 2012 05:25 PM

Paco,

Mant茅n abierto el administrador de tareas de Windows y selecciona desde su men煤 el ver la memoria que consume tu aplicaci贸n y observa si va consumiendo m谩s y m谩s, pudiera ser eso llegando a un punto en que se cae la aplicaci贸n

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: programa colgado en memoria
Posted: Thu Feb 16, 2012 05:30 PM
Tambien puedes monitorizar los objetos GDI usados y los handles abiertos:

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: programa colgado en memoria
Posted: Thu Feb 16, 2012 06:12 PM

Gracias antonio,

revisando cuando acceso al sistema le memoria esta en 12,000 kb aprox. con 110 handles y 250 gdi, conforme trabajo aumenta la memoria a 30,000 kb con 120 handles y hasta 530 gdi y conforme cierro procesos los gdi bajan hasta 350 pero ya no en los originales y la memoria ya no baja sino hasta 29,000 kb, es esto normal? se supone que todas las font, brush, print, bitmaps, querys todo los finalizo con end() y algunos con deleteobject()
se me paso comentar que el programa se queda en procesos (memoira) cuando lo finalizo, durante la operacion no me da problemas...
gracias
paco

____________________

Paco
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: programa colgado en memoria
Posted: Thu Feb 16, 2012 06:49 PM

Si los valores se estabilizan no hay problema, el problema viene cuando no paran de crecer. Observalo...

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: programa colgado en memoria
Posted: Fri Feb 17, 2012 06:40 AM

asi es Antonio, parece que se estabilizan en cierto punto, pero me di cuenta de una cosa por la noche se me colgo hasta para el inicio y cheque con el administrador de tareas y la memoria estaba en 540,000 kb, se me hizo raro que de pronto de estar trabajando de 28000 a 30000 kb subiera tanto, dentro del sistema actualizo un archivo .log para guardar ciertos movimientos del sistema, entonces ese archivo estaba con menos de 2mb, pero al revisarlo cuando se me colgo el sistema estaba en 191mb, entonces llego a la conclusion que por ahi puede estar el problema,
si ese archivo .log se me hace muy grande se cuelga mucho el sistema, aqui el detalle es que no detecte en que momento crecio casi 190mb,
uff muchisisisimo
alguna sugerencia?
gracias
paco

____________________

Paco
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: programa colgado en memoria
Posted: Fri Feb 17, 2012 07:50 AM

Paco,

Que contiene ese archivo log ?

Lo mantienes en memor铆a hasta que finalmente lo grabas en disco ?

Prueba a ir grab谩ndolo a disco, conforme se genera, para asi saber que es lo que est谩 ocurriendo :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: programa colgado en memoria
Posted: Sat Feb 18, 2012 07:28 PM

Antonio,
el el Main.prg tengo esto:
LOCAL cErrText := "", cErrOld := MemoRead("Cambios.log")
luego cuando accesan al sistema hago esto:
cErrText := ""
cErrText += Replicate("*",50) + CRLF
cErrText += "ACCESO AL SISTEMA" + CRLF
cErrText += "Fecha : "+Dtoc(FechaServer())+Space(18)+"Hora: "+Time() + CRLF
cErrText += "==> Usuario : (" + oApp:cIdUsuario + ") - " + oApp:cIniciales + " - " + ALLTRIM(oApp:cUsuario) + CRLF
cErrText += "==> Nivel : " + oApp:cNivel + CRLF
cErrText += Replicate("-",50) + CRLF + CRLF
cErrText += cErrOld
MemoWrit("Cambios.log",cErrText)

como se si el cambio.log se queda en memoria?

y cuando salen del sistema:
cErrText := ""
cErrOld := MemoRead("Cambios.log")
cErrText += Replicate("*",50) + CRLF
cErrText += "SALIDA DEL SISTEMA" + CRLF
cErrText += "Fecha : "+Dtoc(FechaServer())+Space(18)+"Hora: "+Time() + CRLF
cErrText += "==> Usuario : (" + oApp:cIdUsuario + ") - " + oApp:cIniciales + " - " + ALLTRIM(oApp:cUsuario) + CRLF
cErrText += "==> Nivel : " + oApp:cNivel + CRLF
cErrText += Replicate("-",50) + CRLF + CRLF
cErrText += cErrOld
MemoWrit("Cambios.log",cErrText)

gracias
paco
p.d. estoy pensando en guardar el registro de los movimientos en una tabla y olvidar este proceso del archivo .log

____________________

Paco
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: programa colgado en memoria
Posted: Sat Feb 18, 2012 09:32 PM

El problema esta en la salida del programa en este codigo:

cErrOld := MemoRead("Cambios.log")

La variable cErrOld se carga con muchas mb. de datos.

Hacerlo de forma mas adecuada, sin necesidad de cargar en una variable el contenido de Cambios.Log, seria asi:

.................
.................
hCambios:= FOpen("Cambios.Log")
FWrite(hCambios, cErrText)
FClose(hCambios)

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: programa colgado en memoria
Posted: Sun Feb 19, 2012 09:04 AM

Paco,

Si, usar una DBF te permitir铆a poder hacer login de todo lo que el usuario haga, procesos, etc. Es una muy buena idea :-)

hmpaquito, no hay problema por usar MemoRead(), basta con hacer la variable a nil y la memoria usada se liberar谩 :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: programa colgado en memoria
Posted: Sun Feb 19, 2012 10:57 AM

Paco,

La primera comprobaci贸n a hacer y que no te he comentado es controlar el consumo de objetos GDI (fonts, bitmaps, brushes, etc.), puesto que un consumo incorrecto de objetos GDI puede acabar tirando una aplicaci贸n. Para ello lo primero que debes hacer es llamar a esta funci贸n al inicio de tu aplicaci贸n:

SetResDebug( .T. )

y justo antes de salir de tu aplicaci贸n llamar a:

CheckRes()

esto te generar谩 un fichero checkres.txt en donde te aparecen los objetos GDI que no se han destruido ( llamando al m茅todo :End()) correctamente en tu aplicaci贸n, 贸 porque sea un error de programaci贸n en alguna clase, etc. Por favor haz esto y muestra aqui su contenido

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: programa colgado en memoria
Posted: Sun Feb 19, 2012 03:36 PM

Antonio,

Es cierto que no debe haber problema en cargar una variable string con muchas mbs. desde un memoread().
Pero en lo que yo pensaba es que ese memoread() m谩s la siguiente concatenaci贸n de una string ENORME se produce en un momento "delicado" del programa: al salir del mismo.

驴 Qu茅 puede pasar si se le manda el PostQuitMessage() a la aplicaci贸n, y justo en ese momento la aplicaci贸n empieza a hacer el memoread() que es de muchas mbs. m谩s adem谩s la concatenaci贸n a la cadena obtenida que es enorme ? Pues me imagino que lo que est谩 pasando: mucho tiempo de proceso y la aplicaci贸n termina como ventana pero en cambio se queda "pillada" leyendo el memoread() y concatenando; ya a partir de ah铆 el comportamiento, que quede abierta como tarea, es totalmente incontrolado. Esa es mi teor铆a.

Saludos

Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: programa colgado en memoria
Posted: Sun Feb 19, 2012 04:21 PM

He utilizado esta function desde hace tiempo, y hasta el momento no he tenido problemas.

//--------------------------------
Function CrlProceso(cCadena)
local cFile := (cPathDef)+"\Bitaco.txt", nHand
local cCad:=Dtoc(date())+" "+time()+": "+cCadena
local FO_READWRITE:=2, FO_SHARED:=64 , FS_END:=2 //Fileio.ch

if !file(cFile)
nHand := FCreate( cFile ) // creamos el archivo
FWrite(nHand, cCad + CRLF+"") // escribimos en el archivo
FClose(nHand) // cerramos el fichero
else
nHand := FOpen( cFile, FO_READWRITE + FO_SHARED ) // abrimos el fichero lect-escrit-compartido
FSeek(nHand, 0, FS_END) // nos colocamos al final del fichero
FWrite(nHand, cCad + CRLF+"") // escribimos en el fichero
FClose(nHand) // cerramos el fichero
endif

//WinExec("NotePad.exe "+cFile)
SysRefresh()
Return nil

Saludos.

Francisco J. Alegr铆a P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: programa colgado en memoria
Posted: Mon Feb 20, 2012 06:46 PM

Antonio,
probando el
SetResDebug( .T. )

y justo antes de salir de tu aplicaci贸n llamar a:

CheckRes()

revisando el .txt se quedaban abiertos como 6 fonts y 14 bitmaps de unos menus, corregi el programa, volvi a ejecutar y parece que todo vuelve a la normalidad, esto me arroja el checkres.txt
20/02/2012 12:31:35: ====================================================================================================

de cualquier forma a hmpaquito y mi tocayo, por ahi me parece buena su sugerencia del fope,fwrite y fclose, voy a probar, por lo pronto el programa ya no se queda cogado en memoria, seguire haciendo pruebas
gracias
saludos
paco

____________________

Paco
Posts: 845
Joined: Sun Oct 09, 2005 05:36 PM
Re: programa colgado en memoria
Posted: Mon Feb 20, 2012 08:11 PM
Antonio,

por ahi detecte algunos bmps al salir que no se finalizan, son de un menu,
Code (fw): Select all Collapse
    MENU ::oMenu[6] POPUP 2007
       MENUITEM "Cat谩logo"     FILE ::cDirBmps+"Blancos16.bmp" ACTION IF( VerificaPermisos(4,3),;
                                                                          msginfo("con acceso"), )
      SEPARATOR
       MENUITEM "Entregas"     RESOURCE "Entrega16"            ACTION IF( VerificaPermisos(4,4),;
                                                                          msginfo("con acceso"), )
       MENUITEM "Devoluciones" RESOURCE "Devuelve16"           ACTION IF( VerificaPermisos(4,5),;
                                                                          msginfo("con acceso"), )
      SEPARATOR
       MENUITEM "F贸rmulas"     FILE ::cDirBmps+"Formula16.bmp" ACTION IF( VerificaPermisos(4,6),;
                                                                          msginfo("con acceso"), )
    ENDMENU

este es el .txt
Code (fw): Select all Collapse
20/02/2012 14:06:59: FONT,369760081,TAPPLICATION:NEW(241)->MAIN(47)
    
20/02/2012 14:06:59: BMP,1812270401,MENUADDITEM(42)->TAPPLICATION:MENUS(301)->MAIN(81)
    
20/02/2012 14:06:59: BMP,486874086,MENUADDITEM(42)->TAPPLICATION:MENUS(304)->MAIN(81)
    
20/02/2012 14:06:59: BMP,-1794830974,MENUADDITEM(42)->TAPPLICATION:MENUS(306)->MAIN(81)
    
20/02/2012 14:06:59: BMP,50662747,MENUADDITEM(42)->TAPPLICATION:MENUS(309)->MAIN(81)
    
20/02/2012 14:06:59: FONT,-754313320,TRESERVA:NEW(156)->(b)TAPPLICATION:MENUGACC(827)->TRBTN:CLICK(579)->TRBTN:LBUTTONUP(754)->TCONTROL:HANDLEEVENT(1489)->TRBTN:HANDLEEVENT(1406)->_FWH(3409)->WINRUN(0)->TMDIFRAME:ACTIVATE(992)->TAPPLICATION:SHOWWINDOW(641)->MAIN(85)


y una font aplicada a un RBBTN...
como finalizarlos al cerrar el sistema?
salu2
paco
____________________

Paco