FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#21
|
||||
|
||||
Hola nuk3zito,
Antes que nada espero que no te molestes demasiado por mis palabras. La verdad es que tener tanta cantidad de objetos no es muy común (sobre todo si se tiene en cuenta que al parecer sólo estamos hablando de un módulo) y creo que por más que unos 1300 objetos no ocupen demasiada memoria (en promedio 4 bytes [lo que "ocupa un objeto"] por 1300, no es taaanto), me parece que en forma general, sin conocer con mayor profundidad como estás llevando a cabo todo el proceso y el código, que es un mal diseño. No es por criticarte, pero es que a mi esa cifra me indica que hay un mal análisis y diseño. Creo que deberías replantear la posibilidad de que se analice el tema nuevamente. Dices que obedeces ordenes, pero ¿no existe la posibilidad de que propongas una revisión? Si hay problemas con la recolección de basura, es porque algo mal tienes. En algún punto de todo el código que tienes hay una falla; no es por desacreditarte... somos humanos. Nos podemos equivocar. Quizá es un error tonto y se te pasó. Suele pasar, a mi pasa. Puede pasarte a ti, en vez de apresurarte a dictaminar que es un bug ¿porqué no revisas el código y le haces una traza? Trantandose de algo que posiblemente sea algo grande. Lo mejor es llevar un buen proceso de control, un plan de pruebas. Sólo me voy a tomar la libertad de hacer una simple pregunta ¿Es muy estrictamente necesario tener 1300 objetos? Tal vez me digas: no hay tiempo, se necesita para ahora, que no se vale retocar todo. Lamentablemente esta es una situación en la que muy posiblemente debas retocar muchas cosas. Un Out of memory no sale por arte de magia y en verdad para que salga algo mal hay que hacer. No te digo que tu hayas mal programado. No te culpo a ti, sino que te hago saber que ante situaciones como éstas es mejor ser más precavido, más abierto, analizar más y recién codificar. Tal vez se pierda más tiempo pero esto a la larga puede hacerte ganar tiempo. No más esa es mi opinión, y como cualquier otra, está sujeta a la voluntad de cada quien en ignorarla, aceptarla, escucharla, compartirla y/o rechazarla. Saludos, |
#22
|
||||
|
||||
explicate!
|
#23
|
||||
|
||||
Hola Javier,
¿Que no es que es eso lo que ocupa la variable que apunta al objeto? Se que no es una medida tan fiable y exacta de lo que ocupa realmente un objeto, pero al menos 4 bytes por los 1300 nos da 5200 bytes. Y bueno... de allí ya podemos empezar a hacer algunas cuentas de lo que se está "consumiendo". Saludos, |
#24
|
||||
|
||||
Saludos Delphius,
He visto puros famosos por aquí, me da gusto. Cita:
Mira, te cuento la idea principal. El reporteador usa Excel como complemento, y lo que pasa es que se requiere proteger en gran medida los datos y la manera en que estos se calculan y a excel solo se le deja la tarea de recibir nuestros valores. Lo que se nos ocurrió en su momento es solo enviar los valores a nuestra hoja de excel y listo... que él se encargue del otro asunto. Ahora bien, siendo Delphi un lenguaje orientado a objetos, la idea aquí es que cada elemento se manejara por si solo (quize probar ese poder), que cada elemento tuviera sus propios métodos y propiedades. Como tu bien dices, nadie está excento de errores y creo que el mío puede estar al momento de liberar la memoria con el "free" (mi no basta experiencia con esto me hace dudar que el free libere de manera correcta el objeto) Con esto supongo que te refieres a la referencia a un objeto, pero una instancia de un objeto ocupará tantos bytes compongan sus miembros. De todos modos dejemos esto a un lado, lo que realmente importa es que aunque cada instancia pesara 1Kb esto multiplicado por 1300 (que es el numero de elementos de mi reporte) se me sigue haciendo poco, así que en este grado solo estoy buscando cual fue mi error, en cual línea de código está. Cita:
Agradezco como no tienes idea cualquier aporte de los foristas.
__________________
Tiempo y ocasión acontecen a todos! Última edición por nuk3zito fecha: 05-12-2008 a las 20:42:29. Razón: Quité la "s" que confunde :p |
#25
|
||||
|
||||
¿Famoso? ¿Donde?
El día que yo sea famoso va a estallar el mundo debido que mi ego va a ocupar todo el planeta. No más es que me tomo el tiempo aquí. De famoso no tengo nada, excepto el ser un loco trastornado. Antes de ponerme los guantes, debido a una mala interpretación de tus palabras, quiero preguntarte ¿bajo que contexto debo entender cuando me dices "que no tengo ideas"? No puedo distinguir si me estás insultando educadamente y me tome el raje, diciendome algo como "Si no tienes p.. idea vete a otro lado"; o por el contrario me lo dices debido a que no te he ofrecido alguna alternativa a tu diseño. Por la forma en como está redactado tu mensaje, puede interpretarse de muchas maneras. De igual modo yo no fui lo suficientemente claro al explicar la cuestión de los 4 bytes. Saludos, |
#26
|
||||
|
||||
DISCULPAME!!!
Realmente se me fue una "s" de más... Entiendo tu reacción tal como se ha desencadenado el hilo. Sorry en verdad. Una letrita puede cambiar todo el sentido de una frase. Cita:
__________________
Tiempo y ocasión acontecen a todos! |
#27
|
||||
|
||||
Bueno, ideas... ummm puedo maquinar algunas cuantas en cuestión de algunas horas.
Se que te puede sonar muy parecida mi idea, pero.... ¿Porqué no un TStringGrid? La cuestión es que prefiero tirarte una serie de interrogantes para que tu mismo juzgues tu diseño y puedas encontrar ya sea una nueva alternativa o en su defecto, los puntos débiles del diseño. 1. ¿Que tan particular es un panel respecto a otro? ¿Son muy particulares? No comparten algo en común, fuera de una cuestión de que responde a una misma clase, y por tanto tienen las mismas características. A lo que voy es es a esta pregunta fundamental: ¿Que hace único a un panel, botón, o sea el control que sea? 2. Relacionado con el anterior, como corolario, ¿Existe algún tratamiento común a todos? 3. ¿Quien crea a quién? ¿Quien borra a quién? ¿Quién es dueño de quién? En fin cualquier pregunta que te permita establecer el grado de pertenencia y relación entre los objetos. En pocas delimitar claramente el alcance de cada clase y el ciclo de vida que le corresponde. 4. ¿Hasta que punto se hace empleo de métodos genéricos? ¿Son muy particulares? ¿Son virtuales? ¿Que tan amplia es la jerarquía de clases? ¿Es congruente la representación "física" del reporte con el tamaño del diseño de las clases? Por ahora se me ocurren estas preguntas, puede que más adelante surjan otras. Saludos, |
#28
|
||||
|
||||
Cambia tu bucle por este otro:
El bucle que haces era en orden ascendente, pero cuando eliminas uno, el Count cambia, por lo que siempre que eliminas uno, te saltas otro....ejemplito: tienes en el stringlist: Código:
cero uno dos tres Código:
uno dos tres Código:
uno tres Peor aún, no se termina de eliminar los elementos del stringlist, no ya los objetos en sí mismo, sino las cadenas de texto que tengas. Como norma general: al destruir elementos de cualquier tipo de array o lista, hazlo siempre en orden descendente. Con mi modificación no haría falta utilizar un bucle descendente, ya que no elimino el "string", pero para recordar este tipo de fallos, siempre lo hago. ¿Por qué no hago el "Delete(i)"? Por que es más eficiente borrarlos todos de un golpe con Clear, que ir borrándolos uno a uno. Si no necesitas borrarlos todos, pone el delete(i) dentro del bucle, ahora no fallará. Como ves Delphi aquí no tiene nada que ver, primero tenemos que reconocer que somos novatos, para aceptar este tipo de fallos y aprender de ellos, es la única forma de llegar a ser algún día... por ejemplo cómo cHackAll Como ya dije, no estoy de acuerdo con crear 1300 botones, pero si ha de hacerse...se hace. Hacerlo "pa ná" es tontería Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 05-12-2008 a las 21:47:53. |
#29
|
||||
|
||||
Gracias Lepe,
Realmente este es el codigo que tengo. Por querer maquillarlo puse ese Delete() por error.
La primera vez si tenia un Delete() (hace como un mes), pero ese fue corregido en la misma hora.... lo dejé comentarizado
__________________
Tiempo y ocasión acontecen a todos! |
#30
|
||||
|
||||
1º- Si en un except no haces nada, estás ocultando esa excepción, por tanto jamás encontrarás el fallo que hay en esa rutina. Entiendo que estando desesperado o simplemente apresurado, lo hayas puesto. 2º- ¿para qué está el polimorfismo en delphi? pues a usarlo. Todos las clases heredan de TObject en delphi, pero si llamamos a Tobject.Free, delphi sabrá que ese objeto es en realidad un TobjTitulo o lo que sea, por tanto, ejecutará el TobjTitulo.Free o el destructor que le corresponda. 3º- Ese bucle está bien, por tanto, olvida ese código y pasa a mirar si en algún momento estás liberando alguno de esos objetos. Por último pasa por mirar el método destroy de cada uno de tus clases: TobjTitulo, TobjFormulaExcel, etc porque ahí estará el error. De hecho he modificado el código para que salte un ShowMessage en la clase que te da el error al liberarlo de memoria, creo eso te ayudará a localizar el error. Si sale el error antes que el ShowMessage, es precisamente porque objects[i] tiene un puntero no válido, es decir, es distinto de nil, pero apunta a una zona de memoria que ya se liberó, ataca por ahí. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 05-12-2008 a las 22:13:01. |
#31
|
||||
|
||||
Gracias Lepe por tomarte el tiempo de modificar el código.
Cita:
Cita:
Cita:
Que bueno que me mencionas que revise los métodos destroy... ahora están vacíos pero existen (porque antes tenían código), los voy a eliminar puesto que no hay nada que liberar ya de manera explícita. Se que el error está en una simple línea seguramente, gracias nuevamente.
__________________
Tiempo y ocasión acontecen a todos! |
#32
|
||||
|
||||
Solucionado!!!?
Buenas tardes,
Referente a este penoso problema les comento que todos y ninguno tuvo la razón. Algunos de los comentarios fueron muy atinados (la mayoría de hecho) para resolver el problema según lo que parecía que podría ser la causa, sin embargo, me he dado cuenta que este problema no se me está presentando en otras computadoras con Windows XP (yo utilizo Vista Bussines) y en Vista dejó de presentarse cuando eliminé los ìconos que se mostraban en los botones (los tomaba de un ImageList)... al menos en mi laptop esto pasaba. Como mencioné al inicio del post... usaba los TJvXPButton pero en el título del post mencioné TBitBtn para dar a entender con esto que no importaba realmente el componente desde donde heredaba... la realidad es que si importaba mucho, ya que con los TBitBtn's se presentaba ese problema en menor escala que con los TJvXPButton, pero aún así se presentaba en ambos casos. El problema radicalmente dejó de presentarse cuando eliminé las imágenes de los botones. Solución: Necesito revisar y reinstalar mi laptop... y temporalmente quitar las imágenes de los botones. TODO EL PROBLEMA ES LO VISUAL según he visto, ya que sin estar creando o eliminando objetos el problema se presentaba al estar "refrescando" explícita o implícitamente la pantalla (principalmente al hacer algún scroll). Más bien es veredicto, ya que probando este mismo módulo en PC's con Windows Vista si se llegó a presentar el problema (aunque con menor frecuencia que en mi laptop) aunque en la computadora tuviera 256 Mb de memoria y otra característica común es que al hacer un scroll en el panel contenedor este tardaba muchísimo en hacer todo su trabajo (dibujar los botones). Debo darle la vuelta al menos a estos componentes visuales tan bonitos (TJvXPButton) ya que a Windows Vista le vale churro si se ven bonitos o no... él busca siempre aplicar sus propiedades a lo que se deje. Nuevamente agradezco todos sus comentarios aunque algunos no sean del agrado de todos, de cualquier mensaje siempre se logra obtener algo positivo. Saludos a todos.
__________________
Tiempo y ocasión acontecen a todos! |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Problema con RaveReports (multiples instancias) | az_jazo | Varios | 2 | 24-05-2006 17:55:03 |
Compartir "objetos" entre varias instancias | mafebresv | Varios | 4 | 16-01-2006 23:38:23 |
Problema al momento de crear objetos | DANY | OOP | 5 | 28-11-2005 10:28:05 |
Problema con TBitBtn | lroblesco | Varios | 1 | 17-02-2005 08:41:07 |
|