Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #10  
Antiguo 07-10-2005
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 24
Mick Va por buen camino
Solo comentar una cosa, si el componente "casca" al intentar liberarlo, es un bug del componente en particular, no vale una excusa como "claro como esta en medio de la ejecucion hay que esperar a que la cancion finalize" esto no es de recibo, si a un componente u objeto se le ordena que se destruya, es responsabilidad del propio componente realizar las acciones necesarias para destruirse correctamente, parar la cancion o hacer lo que sea para no fallar.
En resumen, yo no utilizaria una libreria que tuviese problemas o bugs de ese tipo.

Por otro lado en este caso particular, el problema puede que no venga del componente en si, sino en que el orden de destruccion de objetos del codigo realmente no parece correcto.
Esto lo digo por el objeto TAudioOut es el que accede y utiliza el objeto TVorbisIn, como podemos deducir de la siguiente asignacion durante la inicializacion:

TAudio.Input:= TVorbisEntrar;

Es decir el objeto TAudioIn guarda un puntero o referencia al objeto TVorbisIn.

De esto se deduce que lo logico seria destruir primero el objeto TAudioIn y despues su TVorbisIn correspondiente. Haciendolo al reves, el objeto TVorbisIn deja de existir antes que el objeto TAudio, y este ultimo no se tiene porque enterar de que el TVorbis ya esta destruido de modo que puede intentar acceder al objeto TVorbis "despues" de que este ya haya sido destruido dando el logico error.

Otra posible solucion si se quiere destruir los objetos en el orden inverso seria hacer un:

TAudio.Input:= nil;

Antes de destruir el objeto TVorbisIn, para que no quede en la propiedad TAudio.Input un puntero a un objeto que realmente ya no existe.

En resumen como regla general:

No se debe destruir nunca un objeto si todavia existen otros objetos que hace referencia a él. Si hacemos esto, los objetos que guardan punteros o referencias al objeto destruido pueden dar errores cuando traten de accede a un objeto que ya no existe.
Esta regla es generica, despues en casos particulares puede que no sea necesaria, por ejemplo si los objetos con los que estamos trabajando y que enlazamos tienen internamente programado algun tipo de sincronizacion o aviso de destruccion entre si para evitar el error. Pero en estos casos estaria indicado y explicado en la documentacion de los objetos o librerias que utilicemos.

No he examinado el codigo fuente ni la documentacion de los componentes que utilizas, de modo que no se si realmente esos componentes utilizan algun tipo de evento o aviso interno para evitar este tipo de errores, asi que no se si todo lo que he dicho en este post es valido para tu caso particular.

Saludos
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:45:41.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi