Page 1 of 1

No libera la memoria cuando genero pdf

PostPosted: Sat Mar 07, 2009 10:12 pm
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  Expand view

         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

Re: No libera la memoria cuando genero pdf

PostPosted: Sun Mar 08, 2009 2:03 am
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

Re: No libera la memoria cuando genero pdf

PostPosted: Sun Mar 08, 2009 8:42 am
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

Re: No libera la memoria cuando genero pdf

PostPosted: Sun Mar 08, 2009 1:17 pm
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.

Re: No libera la memoria cuando genero pdf

PostPosted: Mon Mar 09, 2009 7:55 pm
by TecniSoftware
Alguna idea?
Alguien?

Muchas gracias!

Re: No libera la memoria cuando genero pdf

PostPosted: Mon Mar 09, 2009 8:16 pm
by sygecom
Traté de hacer uso de:
HB_GCALL(.T.)

Re: No libera la memoria cuando genero pdf

PostPosted: Mon Mar 09, 2009 10:30 pm
by TecniSoftware
He utlilizado HB_GCALL() con el mismo resultado, pero no se para que sive con .T.

Saludos!

Re: No libera la memoria cuando genero pdf

PostPosted: Tue Mar 10, 2009 2:19 pm
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.