Capítulo siete
Los diferentes proyectos que pueden realizarse dentro del ambiente de desarrollo de Visual Basic 5.0 tiene diferentes características entre ellos y entre las clases que contienen. Veamos detalles teóricos de estas características:
Los detalles que se verán se observan en el ambiente de Visual Basic 5. Para ver características particulares de un proyecto seleccione ProjectName Properties... del menú Project. Para ver las propiedades particulares de un módulo de clase vea la ventana de propiedades (F4) para cada módulo de clase.
Referencias: Artículos: "Simplify your support Classes" de la revista Visual Basic Programmer`s Journal de Enero 1998.
Si observamos la imagen anterior podemos notar dos áreas que en este caso nos interesa recalcar en esta ocasión.
El Project Type nos dice el tipo de proyecto que estamos desarrollado en el cual podemos escoger entre Standard Exe, ActiveX Exe, ActiveX Dll y ActiveX Control. Al escoger en cada uno de ellos podemos observar algunas otras propiedades de esta ventana se habilitan y otras se deshabilitan presentando diferentes opciones de configurar el proyecto.
El la sección de Threading Model se pueden observar diferentes formas de configuración para el manejo de hilos de ejecución dentro del proyecto dependiendo del tipo de proyecto.
Al tener este tipo de proyecto crearemos una aplicación stand-alone. Si observamos en la imagen anterior podemos ver que no se tiene ningún modelo de hilos de ejecución.
Si tenemos un módulo de clase en el proyecto, podemos observar las siguientes propiedades en la ventana de propiedades:
En este tipo de proyectos solo podemos dar un nombre al módulo de clase, no nos ofrece mas características debido a que es una aplicación stand-alone, no comparte nada, no es un servidor. Se utilizan las clases para tener más control sobre los objetos internos y para organizar y controlar bien nuestras reglas de negocio.
Si seleccionamos que el tipo de proyecto, en la ventana de propiedades del proyecto, sea del tipo ActiveX Exe, el modelo de hilo de ejecución se habilita.
Thread per object: informa a VB a crear un nuevo hilo para cada petición de CreateObject de las clases marcadas como MultiUse. Cada hilo tiene una única copia de todas las variables globales y objetos, y no interfieren con ningún otro hilo. Se recomienda un número pequeño de Clientes/Objetos porque proporciona a cada cliente con un hilo dedicado en el servidor que existe exclusivamente para servir las necesidades de ese cliente. Caso contrario, para una gran cantidad de Clientes/Objetos causa que el servidor consuma una gran cantidad de recursos y causara un rendimiento bajo.
Thread Pool: reduce el número de hilos que consume un proceso de servidor sencillo. En esta opción se determinan el número máximo de hilos que se crearan para servir a nuevos objetos. Mientras los objetos creados estén bajo este numero esta opción funcionara como Thread per object, cuando supere la cantidad asignada VB comienza a asignar las peticiones a hilos existentes. Esto significa que varios clientes pueden compartir hilo, lo cual es bueno porque consume menos recursos y malo porque un cliente podría bloquear a otro. Si al cantidad de hilos a crear es igual a uno, entonces coloca el código en modo compatible con VB4 al manejar los objetos a residir en el hilo principal del proceso del servidor ActiveX Exe.
Al tener este tipo de proyecto las lista de propiedades para un módulo de clase se vería así:
Con respecto al tipo de proyecto Standard Exe tenemos aquí una propiedad más llamada Instancing el cual nos indica la forma de crear instancias de la clase fuera del proyecto y si es así como se comportara. Las opciones que se muestran son:
Prívate: No se permite el acceso a otras aplicaciones sobre la información de la librería de tipos y no podrá instanciarlo. Estos objetos solo se usan internamente dentro del componente que contiene la clase.
PublicNotCreatable: Otras aplicaciones pueden hacer uso de esta clase solo si es creado el objeto primero por el componente que contiene la clase. No se requiere el uso de CreateObject o New debido a que el objeto ya fue creado e inicializado por el componente que lo contiene. Por ejemplo, teniendo referenciado dentro del proyecto el componente de DAO 3.5, podemos utilizar el método OpenDatabase (set dbname = OpenDatabase...) sin tener que utilizar una referencia de un objeto especifico que exponga el DAO tal como lo hace OpenRecordset (Set rsname = dbname.OpenRecordset...) el cual requiere de un objeto tipo DataBase.
SingleUse: permite crear objetos de la clase pero cada objeto creado de esta clase crea una nueva instancia de tu componente. No permitido en proyectos de tipo ActiveX DLL. Por ejemplo, en MS Excel por cada instancia a este componente se ejecuta Excel en forma separado (en la barra de tarea tendriamos dos icono para cada instancia).
GlobalSingleUse: Igual al anterior, excepto que las propiedades y métodos de la clase pueden ser invocadas como si fueran simples funciones globales. No permitido en proyectos de tipo ActiveX DLL.
MultiUse: permite crear objetos de la clase. Una instancia de tu componente proporciona cualquier número de objetos creados de esta manera. Por ejemplo, en versiones anteriores de MS Word para Windows 95 por cada instancia a este componente se ejecuta Word solo una vez (en la barra de tarea tendriamos solo un icono soportando multiple clientes); de la versión de Windows 95, inclusive, a la de Office 97 se comporta como SingleUse, ver arriba.
GlobalMultiUse: Igual al anterior, con una añadidura: propiedades y métodos de la clase pueden ser invocados como si fueran simples funciones globales. No es necesario que explícitamente creamos una instancia de la clase porque uno será creado de forma automática.
Si seleccionamos que el tipo de proyecto, en la ventana de propiedades del proyecto, sea del tipo ActiveX Dll, el modelo de hilo de ejecución se habilita de la siguiente forma (disponible con el Service Pack 3):
Single Threaded: pone el código en modo de compatibilidad con VB4 y forza a los objetos creados a residir en el hilo principal (STA: Single Threaded Apartment) del proceso del cliente. Si el cliente trata de crear uno de los objetos desde cualquier otro hilo o apartamento, COM automáticamente regresara una representación o agente (proxy) al invocador. Esto asegura que todo acceso al los objetos son serializados hacia el hilo principal. Esto puede impactar el rendimiento debido a que se requieren de dos cambios de hilo para cada llamada a un método.
Apartment Threaded: De esta forma VB5 añade la entrada ThreadingModel=Apartment para cada clase que la librería DLL exporta. Esto le indica a COM que se adelante y para crear los objetos dentro del hilo o departamento del invocador, proporcionando que el hilo invocador no se ejecute dentro de un departamento multihilo (MTA: Multithreaded Apartment) en el proceso.
Al tener este tipo de proyecto las lista de propiedades para un módulo de clase se vería así:
Con respecto a un proyecto de tipo ActiveX Exe, aquí solo tenemos 4 de las seis opciones para la propiedad de clase Instancing. Estos cuatro son los siguientes:
Prívate: lea arriba en el proyecto de tipo ActiveX Exe para la descripción de esta opción.
PublicNotCreatable: lea arriba en el proyecto de tipo ActiveX Exe para la descripción de esta opción.
MultiUse: lea arriba en el proyecto de tipo ActiveX Exe para la descripción de esta opción.
GlobalMultiUse: lea arriba en el proyecto de tipo ActiveX Exe para la descripción de esta opción.
El modelo de hilo de la ventana de propiedades para este tipo de proyecto es igual al tipo de proyecto ActiveX DLL:
Ver arriba, ActiveX DLL, para detalles de los tipos de modelo de hilo Apartment Threaded y Single Threaded.
En este tipo de proyecto se habilita otra opción dentro de la ventana de propiedades del proyecto:
Esta opción habilita el licenciamiento para un proyecto que produce componentes ActiveX (servidores de automatización, controles de usuario o controles ActiveX). Solo se aplica a este tipo de proyecto. Habilitada esta opción, VB creará un archivo de licencia (*.vbl) que deberá ser registrada en la maquina del usuario para los componentes a ser usados en el ambiente de diseño. El programa SetUp Wizard construirá un programa setup que registrara apropiadamente la información en el *.vbl en la maquina del usuario final.
Al tener este tipo de proyecto las lista de propiedades para un módulo de clase se vería así:
Con respecto a un proyecto de tipo ActiveX Exe, aquí solo tenemos 2 de las seis opciones para la propiedad de clase Instancing. Estos dos son los siguientes:
Prívate: lea arriba en el proyecto de tipo ActiveX Exe para la descripción de esta opción.
PublicNotCreatable: lea arriba en el proyecto de tipo ActiveX Exe para la descripción de esta opción.