Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
I Semestre 1999
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Tarea #7 [solución]

Programación por eventos

      En esta tarea usted desarrollará un grupo de clases que sirven para hacer programas en forma similar a como se hacen cuando se sigue el paradigma de programación por eventos. Aunque las bibliotecas de programas para programación por eventos son un tanto más complicadas que la biblioteca que usted desarrollará, en esencia la programación por eventos consiste en utilizar, por lo menos, las siguientes reglas para construir programas:

      La interacción del usuario del usuario con el programa se da a través del método MiEvento::TRABAJE(), que contiene un instrucción switch para invocar a las funciones que componen el programa.

/* MiEvento.h ... */
// ...

class MiEvento : public Evento {
   // ...
   virtual void TRABAJE();
   bool Terminado();
};

/* Archivo.c++ ... */
//...

void MiEvento::TRABAJE() {
    while (!Terminado()) {
        switch Evento::Escogencia() of {
            1: Opcion_01 ( MensajeInt(1), MensajeStr(2) ); break; 
            2: Opcion_02 ( MensajeStr(1) );                break;

        default: Evento::Error("Entrada inválida");
        }
    }
}

      Los métodos Evento::MensajeInt(const int), Evento::MensajeStr(const int), etc. retornan el valor que el usuario del programa ha digitado, en formato de número entero ("Int"), hilera ("Str"), o de otro tipo.

      Para simplificar su trabajo, suponga que mediante las clases Evento y MiEvento el programador cliente puede desplegar un menú con las opciones disponibles. También incluya un método virtual llamado MiEvento::PreMenu(x,y,...), que será ejecutado antes de desplegar el menú, el que el programador cliente puede aprovechar para desplegar algunos mensajes o valores en las coordenadas (x,y) de la pantalla, después de que el menú ha sido desplegado, pero antes de que el usuario del programa pueda entrar datos.

     CALCULADORA DE POLINOMIOS     
     =========================

 p1    = 25 x^2 + 3
 p2    = 35
 p1+p2 = 25 x^2 + 38

 [1]  p1 = 0
 [2]  p2 = 0
 [3]  p1 = 5 x^7 + x^2 + 4
 [4]  p2 = 12 x^3 + 4x^2 + 71
 [5]  p1 = -p1
 [6]  p2 = -p2
 [7]  Digitar valor para p1
 [8]  Digitar valor para p2
 [+]  Sumar p1+p2
 [-]  Restar p1-p2
 [*]  Multiplicar p1*p2

      Escoga su opción [+]

      Su trabajo consiste en diseñar la clase Evento y usarla para implementar de nuevo el programa de la lista parametrizable, que usted desarrolló en la Tarea 6.

      Luego de imprimir la documentación de su programa, y entregarla en clase, envíe su trabajo a los asistentes del curso por correo electrónico. Para esto, haga un archivo empacado .zip cuyo nombre sea su número de carnet. Incluya en ese archivo lo siguiente:

  1. Un documento en formato HTML que describa su clase Evento. Incluya el nombre del compilador que usó.
  2. Instrucciones de uso para su clase Evento.
  3. Explicación de la forma en que ha usado la clase MiEvento para implementar de nuevo su programa de la lista parametrizable.
  4. El código fuente de sus programa.
  5. El código ejecutable de sus programa.

      Después de la fecha de entrega del programa, puede usted instalar en su cuenta personal su solución (no instale antes su solución en Internet, pues en ese caso sería usted culpable de facilitar la copia de su trabajo, y en consecuencia se haría acreedor a la sanción respectiva).

[mailto:] Hilda Pineda y Mario Tenorio

Tiempo de entrega: 14 días
Modalidad: Parejas

Soluciones

From:         Javier Loria 
To:           Adolfo Di Mare 
Subject:      RE: Tarea de Eventos
Me parece que el enunciado de la tarea está bastante bien.

      Comentario (muy basado en la forma en que Windows resuelve el esquema de eventos):

  1. Probablemente yo tendría tres clases una EVENTOS, PILAEVENTOS y MANEJADOR
  2. EVENTOS es una clase abstracta que usan los programadores que quieren generar eventos. Esta clase tiene un método publico que va ha ser invocado para que tenga la posibilidad de saber si se está produciendo el evento que monitorea. Ejemplo: tocaron una tecla, oprimieron un botón del mouse, etc. El evento debe tener un número que lo identifica; ese número se lo asigna PILAEVENTOS.
  3. PILA DE EVENTOS es el que se encarga recibir notificación de que ocurrió un evento y de disparar a el/los manejadores apropiados. En el caso de Windows esta función forma parte del Sistema Operativo. Es muy probable que se deba implementar ahí una PILA de eventos no resueltos.
  4. MANEJADOR es la clase abstracta "Interfaz" que el programador emplea para resolver o manejar el evento. Es la función que podría resolver un evento (devuelve FALSE si no lo resolvió).
class  Evento {
private:
    int numevento;
public:
    virtual int Oportunidad(String Data);
    // Revisa si hay un evento del que monitorea (keypress???)
    // Si no hay un evento: Retorna -1
    // Si hay Evento: Numero de Evento y Data.
    //....
};

class  Manejador {
public:
    int Numevento; // Numero de Evento que Maneja
    virtual int Manejador(String Data);
    // Funcion que maneja el evento
    // Retorna 0 si maneja el evento, -1 si no lo resuelve.
    // ....
};

class  PilaEventos {
public:
    ...
    int RegistraEvento(Evento * OtroEvento);
    // Permite a una clase evento Registrarse.
    // Retorna -1: Error,  0+ Numero de Evento Registrado.
    int ManejaEvento(Manejador * OtroManejador);
    // Permite a un manejador Registrarse.
    // Retorna -1: Error, 0 Ok.
private:
    void Oportunidad(void);
    // Barre los eventos registrador y la de la oportunidad EVENTO
    // de generar el suyo.
    // en DOS tambien invoca a los posibles manejadores.
};

      La idea que yo trataría de fomentar es SEPARAR EL DISPARADOR DEL MANEJADOR. Aparte de que puede haber varios manejadores de un mismo evento. Un ejemplo sería agregar un manejador que use sólo los números y otro para las demás teclas. En Window sería el área donde se hace click.

      Disculpas si el C++ es feo o tiene errores de sintáxis, pero ya se me está herrumbrando...

Javier Loria Beeche

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 1999
Derechos de autor reservados © 1999
[home] <> [/\]