In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

GPF provocado por Xailer?

Foro público de Xailer en español
Responder
jose.luis
Mensajes: 1633
Registrado: Vie Oct 14, 2005 10:56 pm

GPF provocado por Xailer?

Mensaje por jose.luis »

Hola Ignacio,
Creo que Xailer está provocando un GPF cuando cierro un formulario con
varios browses y alguno de esos browses tienen un onGetData donde se hace un
search sobre un memdataset. Os adjunto la imagen del GPF.
El tema está en que el método search 'obliga' a poner el cursor 'reloj de
arena' y el método SetBusy de Application hace un ProcessMessages.
Claro... ese processmessages hace que se lancen mensajes de pintado a otros
browses (aunque ya estén cerrados sus datasets).
Si en Memdataset hacemos esto:
METHOD Search( cExp, lNext ) CLASS XMemDataSet
LOCAL oExp
LOCAL aVars
LOCAL bSearch
LOCAL cField, cTmp
LOCAL nFor, nLen, nAt
LOCAL lFound
MEMVAR cSearch
PRIVATE cSearch
DEFAULT lNext TO .F.
::lOnBof := ( Len( ::aWork ) == 0 )
::lOnEof := ( Len( ::aWork ) == 0 )
// Application:lBusy := .T. <<< Esta linea fuera
oExp := TExpParser():New( cExp )
cSearch := oExp:AddNoNILToVars()
nLen := Len( ::aFields )
lFound := .F.
aVars := {}
FOR nFor := 1 TO nLen
AAdd( aVars, { ::aFields[ nFor ]:cDbfName, "v[ " + Ltrim( Str(
nFor ) ) + " ]" } )
NEXT
cSearch := oExp:ReplaceVars( cSearch, aVars )
::ChangePos( XA_DSNAV_SEEK, cExp )
TRY
bSearch := COMPILAR( cSearch )
nAt := Ascan( ::aWork, bSearch, IIf( lNext, ::nRecno + 1, 1 ) )
IF lFound := ( nAt > 0 )
::nRecno := nAt
ENDIF
CATCH
LogDebug( "Xailer-TMemDataSet: Search error")
END
::UpdateControls( XA_DSNAV_SEEK, cExp, lFound )
// Application:lBusy := .F. << Esta linea fuera
RETURN lFound
Evitamos que aparezca esos Gpf y las búsquedas sean ligeramente más rápidas.
¿Como lo ves?
Saludos,
José Luis Capel


Attached files
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9460
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

GPF provocado por Xailer?

Mensaje por ignacio »

José Luis,
Se está produciendo un error por recursividad y es posible que sea por la
llamada a ProcessMessages() . No obstante, no creo que ganes mucha
velocidad, pero si así se arregla tu problema adelante con ello.
Ten en cuenta de que no tenemos intención de sacar más versiones de Xailer
1.9 y tan sólo ofreceremos soluciones particulares a los usuarios que
encuentren algún problema, por lo que podéis actualizar sin miedo la
librería Xailer.lib con vuestros cambios.
En la versión 2.0 la clase ha cambiado completamente, ya que ahora se apoya
en un TMemRecords como el resto de datasets SQL. Y el método Search también
lo ha hecho.
Un saludo,
--
Ignacio Ortiz de Zúñiga
Xailer support / Soporte de Xailer
http://www.xailer.com
http://www.xailer.info
"José Luis Capel - Aicom" <jose.luis@iaicom.com> escribió en el mensaje
news:[email=4ab35961@svctag-j7w3v3j....]4ab35961@svctag-j7w3v3j....[/email]
> Hola Ignacio,
>
> Creo que Xailer está provocando un GPF cuando cierro un formulario con
> varios browses y alguno de esos browses tienen un onGetData donde se hace
> un search sobre un memdataset. Os adjunto la imagen del GPF.
>
> El tema está en que el método search 'obliga' a poner el cursor 'reloj de
> arena' y el método SetBusy de Application hace un ProcessMessages.
>
> Claro... ese processmessages hace que se lancen mensajes de pintado a
> otros browses (aunque ya estén cerrados sus datasets).
>
> Si en Memdataset hacemos esto:
>
> METHOD Search( cExp, lNext ) CLASS XMemDataSet
>
> LOCAL oExp
> LOCAL aVars
> LOCAL bSearch
> LOCAL cField, cTmp
> LOCAL nFor, nLen, nAt
> LOCAL lFound
>
> MEMVAR cSearch
> PRIVATE cSearch
>
> DEFAULT lNext TO .F.
>
> ::lOnBof := ( Len( ::aWork ) == 0 )
> ::lOnEof := ( Len( ::aWork ) == 0 )
>
> // Application:lBusy := .T. <<< Esta linea fuera
>
> oExp := TExpParser():New( cExp )
> cSearch := oExp:AddNoNILToVars()
> nLen := Len( ::aFields )
> lFound := .F.
>
> aVars := {}
>
> FOR nFor := 1 TO nLen
> AAdd( aVars, { ::aFields[ nFor ]:cDbfName, "v[ " + Ltrim( Str(
> nFor ) ) + " ]" } )
> NEXT
>
> cSearch := oExp:ReplaceVars( cSearch, aVars )
>
> ::ChangePos( XA_DSNAV_SEEK, cExp )
>
> TRY
> bSearch := COMPILAR( cSearch )
> nAt := Ascan( ::aWork, bSearch, IIf( lNext, ::nRecno + 1, 1 ) )
>
> IF lFound := ( nAt > 0 )
> ::nRecno := nAt
> ENDIF
> CATCH
> LogDebug( "Xailer-TMemDataSet: Search error")
> END
>
> ::UpdateControls( XA_DSNAV_SEEK, cExp, lFound )
>
> // Application:lBusy := .F. << Esta linea fuera
>
> RETURN lFound
>
> Evitamos que aparezca esos Gpf y las búsquedas sean ligeramente más
> rápidas.
>
> ¿Como lo ves?
>
> Saludos,
> José Luis Capel
>
>
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder