Saturación de memoria
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Thu Apr 19, 2007 2:53 pm
by mariordz
Aunque he visto que algunas personas han tenido problemas similares en ningún caso he encontrado la solución a mi problema y lo replanteo pra ver si alguien me puede ayudar.
Ejecuto una aplicación que captura las comprobaciones de gastos de viaje de mis usuarios, solo abre una base de datos pero usa muchas ventanas generdas a travez de archivos de recursos (.RC), al principio todo va bien, pero al capturar el programa va incrementandose en recursos consumidos y al final el sistema simplemente se cuelga y no hay otra forma de cerrarlo mas que usando el task manager de windows. Cuando salgo de una ventana en todos los casos la cierro (Ovent:end()) pero siempre llego al mismo resultado. ¿Alguna idea?
Muchas gracias por su ayuda
Esto es lo que uso:
Windows 2000
Fivewin 2.6 para xHarbour 16 & 32 bits
Resource builder 2.0
AJ Make 0.33
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Thu Apr 19, 2007 4:21 pm
by Antonio Linares
Mario,
Normalmente ese problema se debe a un consumo de recursos GDI descontrolado.
Usas bitmaps, brushes, fonts, etc. en tu aplicación ? Los liberas correctamente ?
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Thu Apr 19, 2007 5:52 pm
by mariordz
Antonio muchas gracias por tu pronta respuesta, como te imaginaras estoy incursionando en esta plataforma y me falta un buen por aprender, en cuanto a tu pregunta te puedo decir que no uso fonts, bitmaps o brushes en este programa, te transcribo parte del codigo para que tengas una mejor idea de lo que hago (y posiblemente me puedas sugerir alguna alternativa para hacer el programa mas eficiente.
*Funcion para capturar facturas
function capfacts()
public odial4
sino="S"
do while sino="S"
cNfac=space(12)
nMonf=0
dFechf=date()
ivapor=15
nrep1 := nrep1+" "+nrep2+" "+nrep3+" "+nrep4
nomtec="Nombre del técnico: "+alltrim(n1)+" "+alltrim(n2)
nomsolo=alltrim(n1)+" "+alltrim(n2)
public aConcepto := {"Alimentos","Hospedaje","Telefono","Combustible","Papelería","Otros","Casetas","Transporte","Sin comprobación"}
cConcepto := " "
define dialog odial4 resource "capfacs" of oVentprinc
redefine get nomtec ID 0 of oDial4
redefine get numcomp ID 2 of oDial4
redefine get cNfac ID 4 of oDial4 picture"@!" valid IIF(cNfac=" ",.f.,.t.)
redefine get nMonf ID 6 of Odial4 picture("$###,###.##") valid IIF(nMonf=0,.f.,.t.)
redefine get dFechf ID 7 of oDial4
redefine get ivapor ID 9 of oDial4 picture "##" valid IIF(ivapor=0,.f.,.t.)
redefine combobox cconcepto ID 12 ITEMS aconcepto on change eltipo() of oDial4
activate dialog oDial4
sino="N"
enddo
return
*funcion para elegir tipo de factura
function eltipo()
odial4:end()
public oDialpro
do case
case cconcepto="Alimentos"
facalim()
case cconcepto="Hospedaje"
fachosp()
case cconcepto="Telefono"
factele()
case cconcepto="Combustible"
faccomb()
case cconcepto="Papelería"
facpape()
case cconcepto="Otros"
facotro()
case cconcepto="Casetas"
faccase()
case cconcepto="Transporte"
factran()
case cconcepto="Sin comprobación"
sincomp()
endcase
return
**Inician ordenes y funciones para captura de factura de alimentos
function facalim()
prop=0
tope1=150
define dialog oDialpro resource "propina" of oDial4
redefine get prop ID 1 of oDialpro picture"$###.##"
redefine button ID 2 action oDialpro:end()
activate dialog oDialpro
ivapo=ivapor/100
subt1=nMonf-prop
subt2=subt1/(ivapo+1)
miva=subt2*(ivapo)
define dialog oDialrali resource "resali" of oDial4
redefine get folcom ID 9 of oDialrali
redefine get cNfac ID 10 of oDialrali
redefine get cconcepto ID 11 of oDialrali
redefine get subt2 ID 12 of oDialrali picture"$###,###.##"
redefine get miva ID 13 of oDialrali picture"$###,###.##"
redefine get prop ID 14 of oDialrali picture"$###,###.##"
redefine get nMonf ID 15 of oDialrali picture"$###,###.##"
redefine button ID 7 of oDialrali action regali()
redefine button ID 8 of oDialrali action rechali()
activate dialog oDialrali
return
*funcion que agrega el registro capturado a la base de datos
function regali()
odialrali:end()
comexed=space(60)
IF subt2>tope1
define dialog oDialalex resource "alimexed" of oVentprinc
redefine get comexed ID 1 of oDialalex
redefine button ID 2 of oDialalex action oDialalex:end()
activate dialog oDialalex
ENDIF
use &tmpcap
append blank
go bottom
IF lock()
replace comp_orig with folcom, fechcomp with date(), clase with 1, fechaf with dFechf, nofact with cNfac
replace alimentos with subt2, iva with miva, totalxf with nMonf, tech_id with ctechid, subtotal with subt2
replace total with nMonf, propina with prop, reports with nrep1, iva_por with ivapor, observa with comexed
replace status with "G"
unlock
ENDIF
agrotra()
return
*funcion que desecha el registro capturado
function rechali()
oDialrali:end()
agrotra()
return
****************************************
*Finalizan ordenes y funciones de factura de alimentos (de aqui en *adelante muestro ventanas para el desglose por tipo de factura y *despues le pregunto al usuario si desea capturar otra factura)
****************************************
*funcion que permite elegir si desea capturar otra factura
function agrotra()
define dialog oDialotra resource "otraf" of oventprinc
redefine button ID 1 of odialotra action agreotra()
redefine button ID 2 of oDialotra action noagreotra()
activate dialog oDialotra
return
*funcion que al elegir capturar otra llama nuevamente a la funcion de captura
function agreotra()
oDialotra:end()
capfacts()
return
*Funcion que al elegir no agregar factura pide declaracion de rembolso
function noagreotra()
public oDialreem
oDialotra:end()
define dialog oDialreem resource "reembolso" of oVentprinc
redefine button ID 1 of oDialreem action (odialreem:end(),decdev())
redefine button ID 2 of oDialreem action (oDialreem:end(),addreg())
activate dialog oDialreem
return
*funcion que declara el rembolos a la empresa
function decdev()
public oDialdede
montdep := 0
fechdep := date()
obser1 := space(60)
oDialreem:end()
define dialog oDialdede resource "declarad" of oVentprinc
redefine get nomsolo ID 1 of oDialdede
redefine get folcom ID 3 of oDialdede
redefine get montdep ID 7 of oDialdede picture"$###,###.##"
redefine get fechdep ID 9 of oDialdede
redefine get obser1 ID 13 of oDialdede
redefine button ID 14 of oDialdede action (oDialdede:end(), insregde())
redefine button ID 15 of oDialdede action oDialdede:end()
activate dialog oDialdede
return
*Funcion que inserta el registro de rembolso a la base de datos
function insregde()
oDialdede:end()
use &tmpcap
append blank
IF rlock()
replace nofact with " ", comp_orig with folcom, fechcomp with date(), clase with 0, fechr with fechdep
replace tech_id with ctechid, reports with nrep1, observa with obser1, rembolso with montdep
replace status with "G"
unlock
ENDIF
do addreg
return
*Agrega todos los registros capturdos de la base de datos de captura (temporal) a la base de datos central
function addreg()
use &dbgast
append from &tmpcap
return
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Thu Apr 19, 2007 8:16 pm
by Antonio Linares
Tu código se ve bien,
Tienes instaladas todas las actualizaciones de Windows 2000 ? Es importante que las instales y que vuelvas a probar
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Thu Apr 19, 2007 8:41 pm
by mariordz
Si, tengo instalado w2k SP 4 y todas las actualizaciones de seguridad, de hecho tengo activadas las actualizaciones automaticas de windows, asi como se las active a todos los usuarios de este programa.
En algun foro leí acerca de aumentar los valores en el fivewin.lnk o generar un acceso directo y activar una casilla para ejecutarlo en un espacio separado de memoria pero hasta el momento no he encontrado la solución.
Nuevamente te agradezco tu apoyo y espero que puedas yudarme a resolverlo.
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Thu Apr 19, 2007 9:56 pm
by Antonio Linares
Mario,
Para descartar que pueda tratarse de un problema relacionado con Windows 2000, podrías probarlo en una versión distinta de Windows, a ser posible XP SP2 ?
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Fri Apr 20, 2007 1:41 pm
by mariordz
Antonio, el perfil de software de la empresa es con win 2k, desafortunadamente no tengo ninguna máquina con un SO diferente para probar.
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Fri Apr 20, 2007 2:06 pm
by Antonio Linares
Mario,
Puedes usar el vmware e instalarlo en una máquina con W2K. El vmware te permite crear un ordenador "virtual" en donde puedes instalar XP y probar en él.
Ahora hay una beta de vmware, plenamente operativa, que puede descargarse desde aqui:
http://www.vmware.com/products/beta/ws/
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Tue Apr 24, 2007 1:56 am
by horacio
Rochinha : en el código tenes creadas unas funetes que después no destrís. No se si eso puede consumir demasiados recursos. probá a ver que sucede. espero te sirva
saludos