COM release con error

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

COM release con error

Jose Gregoris
Hola Gente

Al  cerrar mi aplicación acurrió esto:


10:46:48, martes, 11 de mayo de 2010: Unhandled exception - a GPFault('Invalid access to memory location. Reading 0x6C, IP 0x27FB91A (C:\Documents and Settings\Gregoris.GREGORIS-3FDB03\Mis documentos\Dolphin Smalltalk X6\TerrainEditor\Library\TVb3D65.dll)')

ProcessorScheduler>>gpFault:
[] in ProcessorScheduler>>vmi:list:no:with:
BlockClosure>>ifCurtailed:
ProcessorScheduler>>vmi:list:no:with:
ITVEngine(ExternalStructure)>>invalidCall
ITVEngine(IUnknown)>>Release
ITVEngine(COMInterface)>>basicFree
ITVEngine(IDispatch)>>basicFree
ITVEngine(COMInterface)>>free
ITVEngine(Object)>>finalize
MemoryManager>>administerLastRites
MemoryManager>>finalizerMain
[] in MemoryManager>>forkFinalizer
ExceptionHandler(ExceptionHandlerAbstract)>>markAndTry
[] in ExceptionHandler(ExceptionHandlerAbstract)>>try:
BlockClosure>>ifCurtailed:
BlockClosure>>ensure:
ExceptionHandler(ExceptionHandlerAbstract)>>try:
BlockClosure>>on:do:
[] in BlockClosure>>newProcess

A que se puede deber este error ?
TV3D es una interface COM, yo nunca hago un release de los componetes pues se supone que esto se hace solo cuando no hay referencias al componente.Por lo que dice la documentacion de dolphin.

Pero hay cosas que me confunde, como por ejemplo esto que dice la documentacion:

3. If the object has a method for explicitly freeing its external resource(s) programmatically (which will be the case if you've followed the Object Liberation Strategy), then remove the finalization mark immediately after freeing the resource, by sending the #beUnfinalizable message. This reduces finalization overhead and allows objects to die sooner.


Lo que entiendo es que si hay algo que deba ser destruido a pata, hay que hacer lo que dice arriba.
El tema que Andy Bowen en su ejemplo con TV3D hace esto:

MainView>>onViewDestroyed
    Current == self
        ifTrue:
            [self engine free.
            Current := nil].
    super onViewDestroyed

Pero ITVEngine no tiene un destructor especial !.

Me aclaran como se tratan los COM y su release ?


saludos kiko




 

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org
Reply | Threaded
Open this post in threaded view
|

Re: COM release con error

Sebastian Calvo
Kiko:

Basicamente no deberias tener que hacer nada.
El tema del free es para tratar de liberar rapidamente la interfaz, más rápido que lo que seria usando finalización.
Esto es util cuando necesitas forzar a que la finalizacion ocurra en un momento determinado, que vos tengas el control.

De donde obtuviste ITVEngine? De otra interfaz? Porque en ese caso quizas tenes que tener en cuenta el orden en que liberas.
Tambien asegurate que ese free hace lo que Andy dice, luego deberia enviarle beUnfinalizable, fijate que el stack muestra que se envio el finalize, eso es que esta marcado para finalizar.

Saludos


2010/5/14 Jose Gregoris <[hidden email]>
Hola Gente

Al  cerrar mi aplicación acurrió esto:


10:46:48, martes, 11 de mayo de 2010: Unhandled exception - a GPFault('Invalid access to memory location. Reading 0x6C, IP 0x27FB91A (C:\Documents and Settings\Gregoris.GREGORIS-3FDB03\Mis documentos\Dolphin Smalltalk X6\TerrainEditor\Library\TVb3D65.dll)')

ProcessorScheduler>>gpFault:
[] in ProcessorScheduler>>vmi:list:no:with:
BlockClosure>>ifCurtailed:
ProcessorScheduler>>vmi:list:no:with:
ITVEngine(ExternalStructure)>>invalidCall
ITVEngine(IUnknown)>>Release
ITVEngine(COMInterface)>>basicFree
ITVEngine(IDispatch)>>basicFree
ITVEngine(COMInterface)>>free
ITVEngine(Object)>>finalize
MemoryManager>>administerLastRites
MemoryManager>>finalizerMain
[] in MemoryManager>>forkFinalizer
ExceptionHandler(ExceptionHandlerAbstract)>>markAndTry
[] in ExceptionHandler(ExceptionHandlerAbstract)>>try:
BlockClosure>>ifCurtailed:
BlockClosure>>ensure:
ExceptionHandler(ExceptionHandlerAbstract)>>try:
BlockClosure>>on:do:
[] in BlockClosure>>newProcess

A que se puede deber este error ?
TV3D es una interface COM, yo nunca hago un release de los componetes pues se supone que esto se hace solo cuando no hay referencias al componente.Por lo que dice la documentacion de dolphin.

Pero hay cosas que me confunde, como por ejemplo esto que dice la documentacion:

3. If the object has a method for explicitly freeing its external resource(s) programmatically (which will be the case if you've followed the Object Liberation Strategy), then remove the finalization mark immediately after freeing the resource, by sending the #beUnfinalizable message. This reduces finalization overhead and allows objects to die sooner.


Lo que entiendo es que si hay algo que deba ser destruido a pata, hay que hacer lo que dice arriba.
El tema que Andy Bowen en su ejemplo con TV3D hace esto:

MainView>>onViewDestroyed
    Current == self
        ifTrue:
            [self engine free.
            Current := nil].
    super onViewDestroyed

Pero ITVEngine no tiene un destructor especial !.

Me aclaran como se tratan los COM y su release ?


saludos kiko




 

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org
Reply | Threaded
Open this post in threaded view
|

Re: COM release con error

Jose Gregoris
Hola Gallego

ok, entiendo.
De donde obtuviste ITVEngine? De otra interfaz?

No, esto es corazon del engine.

El marcar con  beUnfinalizable, para tener el control, es conveniente hacerlo cuando creas el COM o al liberar ?
Suena lógico  hacerlo al comiezo, pues ya se que ese COM lo voy a destruir a mano, pero como  en Dolphin veo que todos llaman al final ..
Pregunto ?

saludos

--- El sáb 15-may-10, GallegO <[hidden email]> escribió:

De: GallegO <[hidden email]>
Asunto: Re: [clubSmalltalk] COM release con error
Para: [hidden email]
Fecha: sábado, 15 de mayo de 2010, 15:00

Kiko:

Basicamente no deberias tener que hacer nada.
El tema del free es para tratar de liberar rapidamente la interfaz, más rápido que lo que seria usando finalización.
Esto es util cuando necesitas forzar a que la finalizacion ocurra en un momento determinado, que vos tengas el control.

De donde obtuviste ITVEngine? De otra interfaz? Porque en ese caso quizas tenes que tener en cuenta el orden en que liberas.
Tambien asegurate que ese free hace lo que Andy dice, luego deberia enviarle beUnfinalizable, fijate que el stack muestra que se envio el finalize, eso es que esta marcado para finalizar.

Saludos


2010/5/14 Jose Gregoris <kikodelphi@...>
Hola Gente

Al  cerrar mi aplicación acurrió esto:


10:46:48, martes, 11 de mayo de 2010: Unhandled exception - a GPFault('Invalid access to memory location. Reading 0x6C, IP 0x27FB91A (C:\Documents and Settings\Gregoris.GREGORIS-3FDB03\Mis documentos\Dolphin Smalltalk X6\TerrainEditor\Library\TVb3D65.dll)')

ProcessorScheduler>>gpFault:
[] in ProcessorScheduler>>vmi:list:no:with:
BlockClosure>>ifCurtailed:
ProcessorScheduler>>vmi:list:no:with:
ITVEngine(ExternalStructure)>>invalidCall
ITVEngine(IUnknown)>>Release
ITVEngine(COMInterface)>>basicFree
ITVEngine(IDispatch)>>basicFree
ITVEngine(COMInterface)>>free
ITVEngine(Object)>>finalize
MemoryManager>>administerLastRites
MemoryManager>>finalizerMain
[] in MemoryManager>>forkFinalizer
ExceptionHandler(ExceptionHandlerAbstract)>>markAndTry
[] in ExceptionHandler(ExceptionHandlerAbstract)>>try:
BlockClosure>>ifCurtailed:
BlockClosure>>ensure:
ExceptionHandler(ExceptionHandlerAbstract)>>try:
BlockClosure>>on:do:
[] in BlockClosure>>newProcess

A que se puede deber este error ?
TV3D es una interface COM, yo nunca hago un release de los componetes pues se supone que esto se hace solo cuando no hay referencias al componente.Por lo que dice la documentacion de dolphin.

Pero hay cosas que me confunde, como por ejemplo esto que dice la documentacion:

3. If the object has a method for explicitly freeing its external resource(s) programmatically (which will be the case if you've followed the Object Liberation Strategy), then remove the finalization mark immediately after freeing the resource, by sending the #beUnfinalizable message. This reduces finalization overhead and allows objects to die sooner.


Lo que entiendo es que si hay algo que deba ser destruido a pata, hay que hacer lo que dice arriba.
El tema que Andy Bowen en su ejemplo con TV3D hace esto:

MainView>>onViewDestroyed
    Current == self
        ifTrue:
            [self engine free.
            Current := nil].
    super onViewDestroyed

Pero ITVEngine no tiene un destructor especial !.

Me aclaran como se tratan los COM y su release ?


saludos kiko




 

--
To post to this group, send email to clubSmalltalk@...
To unsubscribe from this group, send email to clubSmalltalk+unsubscribe@...
 
http://www.clubSmalltalk.org

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org

 

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org
Reply | Threaded
Open this post in threaded view
|

Re: COM release con error

Sebastian Calvo

El marcar con  beUnfinalizable, para tener el control, es conveniente hacerlo cuando creas el COM o al liberar ?
Suena lógico  hacerlo al comiezo, pues ya se que ese COM lo voy a destruir a mano, pero como  en Dolphin veo que todos llaman al final ..
Pregunto ?

saludos

Deberias hacerlo unicamente, por seguridad, luego de enviarle free. Sentite libre.

Saludos
  GallegO

--
To post to this group, send email to [hidden email]
To unsubscribe from this group, send email to [hidden email]
 
http://www.clubSmalltalk.org