No libera la memoria cuando genero pdf

Post Reply
User avatar
TecniSoftware
Posts: 213
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

No libera la memoria cuando genero pdf

Post by TecniSoftware »

Tengo la necesidad de generar 9000 boletas, las tengo TODAS en vista preliminar y el cliente quiere que salgan todas en el mismo proceso.

En oDevice:aMeta estan los nombres de cada emf ( se los asigné yo de antemano ya que requiero de un nombre específico para cada uno )
y necesito generar un pdf por cada archivo ( uso pdfcreator ), por lo que hice las siguiente modificación a Rpreview, agregándole una opcion aparte:

Code: Select all

         aFiles := oDevice:aMeta
         FOR nFor := 1 TO Len( aFiles )

               cFile := cFileNoPath( aFiles[ nFor ] )
               cFile := cFileNoExt( cFile )
               StartDoc( hDC, cFile )

                    StartPage( hDC )
                    hMeta := GetEnhMetaFile( aFiles[nFor] )
                    PlayEnhMetaFile( hDC, hMeta,, .T. )
                    DeleteMetafile( hMeta )
                    EndPage( hDC )

               EndDoc( hDC )
               SysRefresh()

         NEXT
 
El tema es que al cabo de unos momentos, los pdf se generan perfectamente pero el sistema no libera memoria y llega hasta ocupar 2 gb de la ram!!!
No entiendo por que no libera memoria. Que otra manera hay de hacerlo??? :?

Desde ya muchas gracias!
Uso fwh, bcc55, xhb
Alejandro Cebolido
Buenos Aires, Argentina
Alvaro Urdaneta
Posts: 67
Joined: Wed Mar 29, 2006 10:54 pm
Location: Venezuela

Re: No libera la memoria cuando genero pdf

Post by Alvaro Urdaneta »

Hola Alejandro, yo creo los pdf directamente asi:

#include "FiveWin.ch"

function main()
Local oPdf, nFontPdf

oPdf := tpdf():new( "c:\prueba.pdf", , 612, 792 )

oPdf:pdfSetFont( "COURIER NEW", 0, nFontPdf )

oPdf:Pdfnewpage( "LETTER", "P" )

oPdf:Pdfatsay( "linea 1", 700, 25, .t. )
oPdf:Pdfatsay( "linea 2", 600, 25, .t. )
oPdf:Pdfatsay( "linea 3", 500, 25, .t. )
oPdf:Pdfatsay( "linea 4", 400, 25, .t. )

oPdf:Pdfclosepage()
oPdf:pdfclose()

SHELLEXECUTE( 0, 0, "c:\prueba.pdf", 0, 0, 1 )
return nil

Si crees que esto te puede ayudar descarga este ejemplo de:

http://www.megaupload.com/?d=2PJZDH1D

Saludos

Alvaro Urdaneta
Saludos

Alvaro Urdaneta

Fwh 10.8, xharbour1.2.1, bcc582, Brw45
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: No libera la memoria cuando genero pdf

Post by Antonio Linares »

Alejandro,

> necesito generar un pdf por cada archivo ( uso pdfcreator ),

Como los creas con pdfcreator ?

Por favor muéstranos el código que usas para crearlos, gracias
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
TecniSoftware
Posts: 213
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

Re: No libera la memoria cuando genero pdf

Post by TecniSoftware »

Antonio:

Las facturas son creadas con un objeto de TPrinter standard
PRINT oPrn TITLE "FACTURAS" PREVIEW

Para el caso, es lo mismo que sean facturas u páginas de un reporte cualquiera.
Lo que necesito es que en la misma tanda de impresion, cualquiera sea el origen de los datos TPrinter o TReport,
imprimir de a una cada página ( son como 9000 ) y enviarlas a la impresora virtual PdfCreator, para que
éste me genere un archivo PDF por cada página, repito: es indistinto si es un reporte u otro tipo de impresion.

Como expuse en el código al inicio del post, use como modelo las lineas de código de RPreview que se utilizan para imprimir una sola página, pero
este procedimiento utlizado en forma repetitiva, se come la memoria y no la libera y llega a consumir mas de 2gb!

Sé que existe la clase TPDF, la probé y funciona perfecto pero no se me ocurre como enviar un reporte normal a esa clase.
Inlcusive hice pruebas convirtiendo el .emf a .jpg con un utilitario cualquiera y luego leventando el archivo con la clase TPdf y
el archivo resultante, si bien es de excelente calidad, el PDF creado en vez de tener 44kb como los que me hace PdfCreator, tiene 270kb que por
9000 archivos, es imposible de manejar.
Para las facturas la clase TPDF no me sirve por que es un diseño muy intrincado y además tiene el problema que no acepta insertar una imagen .emf, solo jpg, tiff o png y en todo caso, tendria que convertir los .emf y no tengo idea de con que hacerlo.

La verdad es que estoy desconcertado. Antonio, alguna idea????

Desde ya, muchisimas gracias.
Alejandro Cebolido
Buenos Aires, Argentina
User avatar
TecniSoftware
Posts: 213
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

Re: No libera la memoria cuando genero pdf

Post by TecniSoftware »

Alguna idea?
Alguien?

Muchas gracias!
Alejandro Cebolido
Buenos Aires, Argentina
User avatar
sygecom
Posts: 42
Joined: Tue Mar 11, 2008 3:18 am
Location: Brasil

Re: No libera la memoria cuando genero pdf

Post by sygecom »

Traté de hacer uso de:
HB_GCALL(.T.)
User avatar
TecniSoftware
Posts: 213
Joined: Fri Oct 28, 2005 6:29 pm
Location: Quilmes, Buenos Aires, Argentina

Re: No libera la memoria cuando genero pdf

Post by TecniSoftware »

He utlilizado HB_GCALL() con el mismo resultado, pero no se para que sive con .T.

Saludos!
Alejandro Cebolido
Buenos Aires, Argentina
User avatar
sygecom
Posts: 42
Joined: Tue Mar 11, 2008 3:18 am
Location: Brasil

Re: No libera la memoria cuando genero pdf

Post by sygecom »

Veja o que diz o Help do xHarbour:
HB_GCAll()
Scans the memory and releases all garbage memory blocks.

Syntax
HB_GCAll( [<lForce>] ) --> NIL

Arguments
<lForce>
Passing .T. (true) enforces a complete garbage collection, even if there are only few memory objects to collect. If <lForce> is omitted, or set to .F. (false), the garbage collector is not invoked when there is little or no garbage to collect. Return
The return value is always NIL.

Description
xHarbour's garbage collector is normally invoked automatically during idle states. An idle state is the state of the xHarbour virtual machine (VM) when it waits for user input from the keyboard or the mouse. The VM enters idle state during Inkey() calls. All applications that do not use Inkey() function calls can signal the idle state with a call to the HB_IdleState() function.
Alternatively, garbage collection can be enforced programmatically with HB_GCAll(.T.). This can be advantageous when there is massive use of memory during a loop, for exemple, that includes no user input and no idle state is signalled.
Post Reply