![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Es preferible que no lo hagas. Yo he tenido la inmensa fortuna de conseguir darle la vuelta a este tipo de problemas casi siempre que me he topado con alguno, sin tener que modificar código fuente ajeno. Más importante aún si tal código no es libre e implica volver a hacer lo mismo con otras versiones de Delphi.
Eché un vistazo a TOleControl y su método GetProperty: Creo que hay oportunidad de sustituir el valor del campo FControlDispatch ahí visto, que es una interfaz, por una segunda interfaz que envuelva a la primera, pero copiando desde el nuevo método Invoke el valor devuelto por el viejo Invoke en el seudo-variante Value (cuando éste sea una interfaz) hacia una variable que posteriormente usemos para reducir el contador de forma controlada, en tiempo y forma. Evitando así la inundación y potencial desborde de la memoria. Ahora no dispongo de mucho tiempo, pero en estos días podemos desarrollarlo aquí mismo entre los compañeros interesados en el tema. Podría ser un buen ejercicio colectivo. Un saludo. ![]() Al. |
|
#2
|
||||
|
||||
|
Cita:
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#3
|
||||
|
||||
|
Hola a todos,
Tampoco a mí me hace mucha gracias tocar la VCL, pero, digo un poco lo que Casimiro: buscando una respuesta al problema la encontré, dicho de otra forma: jamás hubiese podido idear la solución al problema en cuestión. Afortunadamente existís los que sabéis más que nosotros. La solución que propones implica poder usar nuestro propio "OleControl" modificado e "interpuesto", si no me equivoco, de modo que no hiciese falta tocar la VCL. Yo me comprometo a hacer las pruebas que sean menester y poco más, me temo. Ciertamente la VCL no es libre, pero, en todo caso, creo que se trata de algo más que comprensible, si no existe otra forma de hacerlo. Al fin y al cabo estamos tratando de solucionar un problema que puede causar un error grave de desbordamiento de memoria. Tal vez no se pueda/deba modificar la VCL, pero, a falta de otra solución, ¿quién estaría dispuesto a continuar con el problema estando ahí disponible una posible solución? Si es cierto que se trata de un bug de Delphi, han tenido desde 1999 para solucionarlo. ¡Gracias de nuevo Al y gracias a todos! |
|
#4
|
|||
|
|||
|
Aunque creo que ya no es necesario, igual pongo el metodoGetIUnknownProp incluido en Delpi 10 Seattle .
Saludos.
|
|
#5
|
||||
|
||||
|
A partir de aquí, de mi parte son solo ideas, pero te invito a intentarlo y ojalá lo consigamos.
Comienza por crear un ayudante de clase (class helper) para TOleControl llamado TOleControlHelper, a fin de acceder de manera formal y segura a su campo privado FControlDispatch. El ayudante debe permitir sobrescribir el valor de ese campo. Y crea una clase nueva llamada TOleControlDispatchFixer que implemente la interfaz IDispatch y contenga un campo protegido llamado InternalDispatch de tipo IDispatch, aunque de momento los métodos de la clase estén vacíos. Usaremos una instancia de esta clase para sustituir y envolver (wrap) a la interfaz que TOleControl guarda en FControlDispatch. Si algo no compila hazlo saber, para contar con la ayuda de los compañeros. Yo regreso luego. |
|
#6
|
||||
|
||||
|
Hola a todos,
Tratando de comenzar con lo que dices, Al, he querido preparar un programa que sirva a modo de ejemplo, y, me he encontrado con alguna cosa "rara" que paso a comentar: 1º Si en un Timer creo un botón (TButton) y lo destruyo a continuación, repetidamente, noto que el programa no consume ni un ápice de memoria más, quedándose en la memoria que ocupaba al principio de su ejecución. (1) 2º Si en un Timer creo un navegador (TWebBrowser) y lo destruyo a continuación, repetidamente, noto que el programa aumenta el consumo de memoria, incluso con el parche efectuado en "Vcl.OleCtrls.pas". ¡De hecho el método parcheado "GetIDispatchProp" no se ejecuta! (2) 3º Si en un Timer creo un navegador (TEmbeddedWB) y lo destruyo a continuación, repetidamente, noto que el programa automenta el consumo de memoria, incluso con el parche efectuado en "Vcl.OleCtrls.pas". ¡Pero esta vez sí que se ejecuta el método parcheado "GetIDispatchProp"! Esto me hace pararme a pensar qué demonios puede estar pasando, habida cuenta de que, en efecto, en mi programa sí que he notado mejoría en el consumo de memoria RAM, si bien es cierto que no se pueden comparar mi programa con el ejemplo que he hecho para hacer estas pruebas: probablemente mi programa consuma mucha más memoria, de modo que tal vez mucha de ella se libere, pero otra más o menos pequeña parte no lo haga, es decir, que parece que el problema sigue estando ahí, hasta cierto punto, como parecen demostrar las pruebas que estoy haciendo. Notas: 1. Sólo si no destruyo los botones creados la memoria aumenta muy poco a poco pero de forma apreciable. 2. Esto me llama la atención doblemente, porque, el compañero que propuso la solución del artículo enlazado, al menos quien escribió el artículo... estaba usando un componente "TEmbeddedWB" y no directamente un "TWebBrowser". |
|
#7
|
||||
|
||||
|
Hola de nuevo,
Más sorpresas... me encuentro en la unidad "SHDocVw_EWB" del componente "EmbeddedWB" con lo siguiente:
Y aquí la unidad en cuestión:
Voy a ver qué pasa con "USE_OleCtrlsFix"... pero, ¿no es esto algo parecido a lo que pretendemos hacer? Ay madre... ![]() Actualizo: No; definitivamente no es lo que se pretende hacer, empero, tal vez sea suficiente y una forma de no tocar la VCL... desde luego acabo de encontrar dicha opción desactivada en el archivo "EWB.inc": voy a probar a activarla a ver qué ocurre... Última edición por dec fecha: 24-11-2015 a las 19:45:30. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Actualizar a Delphi XE desde cualquier versión de Delphi (hasta fin de mes) | rrf | Varios | 0 | 11-03-2011 17:12:05 |
| que tan cierto es que el 25 salio delphi 2009 | gloriamab30 | Noticias | 1 | 05-09-2008 23:55:31 |
| (Corregido) Introduccion a InstantObjects | Ezecool | OOP | 0 | 05-07-2007 22:37:16 |
| Problema con Versión 10 de Indys | AGAG4 | Internet | 4 | 01-02-2006 16:50:27 |
| Ejecutar aplicacion delphi cada cierto tiempo | mgaray | API de Windows | 9 | 28-01-2005 19:16:20 |
|