Desarrollador Profesional de Juegos Programación III Unidad II Una clase thread para window.

Slides:



Advertisements
Presentaciones similares
UNIVERSIDAD PRIVADA SAN PEDRO ESCUELA INGENIERIA CIVIL
Advertisements

Introducción a C++ Sistemas Operativos
Ordenamiento de Arreglos
Clases en C++.
Programación Interactiva Hilos
Ejemplo de Programa C++
Estructuras de control
MANEJO DE EXCEPCIONES EN C++
Informática II Prof. Dr. Gustavo Patiño MJ
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
PROGRAMACION ORIENTADA A OBJETOS
Prof. Franklin Cedeño. FUNCIONES EN C++ Cuando tratamos de resolver un problema, resulta muy útil utilizar la filosofía de “divide y vencerás”. Esta estrategia.
SubRutinas Se pueden usar subrutinas cuando se necesita el mismo trozo de código en distintos lugares del programa. En esos casos se escribe una subrutina.
Qué pasa cuando varios clientes tratan de conectarse al mismo teimpo a un servidor Una forma es ir atendiéndolos de a uno en un ciclo: como en el programa.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Java. Threads (Hebras) Los sistemas operativos actuales permiten la multitarea, aunque esta se de tiempo compartido cuando se trabaja con un solo procesador.
Material de apoyo Unidad 2 Estructura de datos
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SCJP 6.0 SEMANA OCHO THREADS.
Un hilo es un único flujo de ejecución dentro de un proceso. Un proceso es un programa ejecutándose dentro de su propio espacio de direcciones. Los.
Semana 5 Subprogramas..
Clase Teórica No. 4 Programación IV
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SCJP 6.0 SEMANA OCHO THREADS.
C++ LISTAS C++ 11/04/2017 Ing. Edgar Ruiz Lizama.
Programación III Clase 07 Funciones.
PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++
Control de flujo: Bucles

Estructura de Datos y Algoritmos
Capítulo 1 “Elementos de Programación”
Programación Orientada a Objetos usando CONSTRUCTORES DESTRUCTORES.
Administración de Proyectos de desarrollo de Software Ciclo de vida de un proyecto Enfoque moderno Temas Componentes Directivas Declaraciones globales.
Pablo Abrile1 Threads Lenguajes de Programación I.
Applets CONTENIDO ¿Que es un applet? Lo básico de un applet Ciclo de vida de un Applet Las etiquetas de HTML Pasando información a los applets.
Control de errores visual basic
COMP 250.  Ejemplo:  Suponer que se necesita codificar un programa donde se muestre como resultado el string “Bienvenidos al mundo de JAVA!!!” cien.
Elementos básicos del lenguaje
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores.
Elementos básicos del lenguaje
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores.
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores.
Programación Orientada a Objetos
Sesión 09: Sobrecarga (1) /1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad.
INTRODUCCION A LA PROGRAMACION
Threads en Java  Threads: programas multitarea  Creación de threads  Ciclo de vida de un thread  Sincronización.
Capítulo 2 “Subprogramas/Funciones - Arreglos”
Colisiones.. Introducción Algo que vemos mucho en bastantes videojuegos, y que por el momento no se ha visto “bien”, son las colisiones, pero, para empezar;
6. Clases y Métodos..  6.1 Structs  6.2 Funciones  6.3 Namespaces  6.4 Clases.
THREADS JAVA Ing. Esp. Ricardo Cujar. HILO Un hilo es un proceso que se está ejecutando en un determinado momento en el sistema operativo. Se les define.
Introducción al lenguaje PROCESSING para ARDUINO
Algoritmo.
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Objetivos del tema. Hemos visto lo que es la estructura de un programa, los datos, que esos datos en realidad se convierten en variables de distinto.
Arreglos Ejemplo paso a paso. Planteamiento Como estudiante de ingeniería, quieres usar tus habilidades de programador para llevar un registro de tus.
Desarrollador Profesional de Juegos Programación III Unidad II Trabajando con bloqueo de datos.
Desarrollador Profesional de Juegos Programación III Unidad I El manejador universal.
 Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan.
Desarrollador Profesional de Juegos Programación III Unidad II Introdución a threading en windows.
Desarrollador Profesional de Juegos Programación III Unidad II introducción a Mutex Secciones críticas.
C Por Isaí Landa. C C es un lenguaje de programación ¿Quién es C? ¿Cuál es el mundo de C? El mundo de C es un conjunto de cajas. Las cajas guardarán números.
Desarrollador Profesional de Juegos Programación III Unidad I Capturar Excepciones.
Desarrollador Profesional de Juegos Programación III Unidad I Excepciones Tipos.
Lenguaje de Programación II PLAN DE EVALUACIÓN CONTENIDO MODALIDAD DE EVAL. PONDERACIÓN INTRODUCCIÓN BÁSICA AL LENGUAJE DE PROGRAMACIÓN.
1 La sobrecarga de funciones y operadores le da al programador la oportunidad de asignar nuevos significados a las funciones y a los operadores.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Prof. Manuel B. Sánchez.  El origen del término polimorfismo es simple: proviene de las palabras griegas poly (muchos) y morphos (forma) multiforme.
U niversidad de G uadalajara Centro Universitario de Ciencias Exactas e Ingenierías Ponentes: Muñoz Guzmán Ramón Gallardo Olivares Mario Solís Flores José.
Ciclos condicionales y exactos Estructura de control de ciclos
Transcripción de la presentación:

Desarrollador Profesional de Juegos Programación III Unidad II Una clase thread para window

Después de tratar todo el tema thread ya podemos utilizar las funciones que escribimos. Y para hacer nuestro código más limpio y más fácil de entender y programar, lo siguiente es crear una clase thread que debería simplificar la creación y el uso de hilos. Esto nos permitirá no tener que volver a escribir el mismo código una y otra vez por cada thread. En este ejemplo solamente la escribiremos en el archivo main.cpp para no tener que alternar entre la cabecera y archivos de código fuente. ¿Qué necesitamos entonces? Un threadProc, un handle thread, y alguna forma sencilla de iniciar y detener nuestro hilo.

Clase thread #include using namespace std; class CThread { protected: bool terminateThreadFlag; // Flag para parar la ejecucion del threadProc HANDLE threadHandle; // El handle de nuestro thread public: CThread(); // constructor para setear la clase correctamente void begin(); // arranca el thread y ejecuta threadProc void end(); // señal para detener el thread virtual void threadProc() = 0; // Haremos este método virtual para poder heredar nuevos threads con un nuevo // método. Servirá para tener que definir solamente este método para cualquier // nuevo hilo que tengamos que crear, y poder así usar los demás métodos sin // reescribirlos. };

Clase thread CThread::CThread() { terminateThreadFlag = false; // para indicar al thread que NO termine! threadHandle = NULL; // NULL al handle del thread } /* En las unidades anteriores vimos que los hilos realizaban un ciclo un número determinado de veces. En la práctica, por lo general queremos que nuestros hilos hagan algo hasta que le indiquemos que se detengan. Para esto vamos a usar el terminatethreadFlag. Haremos un ciclo en nuestro threadProc que revisará el flag y si es TRUE, va a salir del ciclo. Debería ser algo como esto: */ aSampleThreadProc () { while( terminateThreadFlag == false) { //hacer algo acá }

El método end es muy simple. Todo lo que necesitamos hacer es poner nuestra terminateThreadFlag en true y entonces el procedimiento en forma automática deberá salir al final de su ciclo de proceso. // setea el terminate flag y permite al threadProc terminar naturalmente void CThread::end() { terminateThreadFlag = true; // usaremos waitForSingleObject acá para esperar al thread terminar. WaitForSingleObject( threadHandle, INFINITE); } //Este método detendrá la llamada del thread hasta que este thread //termine su ejecucion. Clase thread

Mientras terminar un thread es simple comenzarlo no es tan fácil. Tenemos un pequeño problema. Windows no tiene a threadProc como método de su clase. Esto significa que Windows no permitirá a CThread::threadProc() ser un método que pasaremos a CreateThread(). Obviamente que es un problema desde que queremos crear la clase para tenerlo como miembro de ella. La solución es un pequeño truco para engañar a Windows para que lo ejecute. Creamos una función común C++ que aceptará un puntero a CThread como argumento y entonces podremos correr el threadProc. void WindowsThreadFunction( CThread* theThread) { // ejecuta el theadProc theThread->threadProc(); }

Clase thread Recordemos que en la unidad anterior pasamos una variable a threadProc en la función CreateThread. Acá haremos lo mismo. Solamente que en vez de pasarle la dirección de un entero, pasaremos un puntero al thread que queremos arrancar. void CThread::begin() { // creamos el thread notando que aparece "this" en el 4 parámetro. threadHandle = CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE) WindowsThreadFunction, this, NULL, NULL); } // Cuando llamemos a CThread.begin() creamos el thread que ejecutará WindowsThreadFunction que escribimos y este llamará a nuestro threadProc.

Ahora que tenemos todas las piezas ¿Cómo las utilizamos? Definiremos un hilo con un ThreadProc. Haremos algo simple, por ejemplo un hilo que imprima números hasta que le digamos que pare. class CPrintSomethingThread : public CThread { public: int numberToPrint; // el numero a imprimir void threadProc( ) { // nuestro threadProc cout << “comenzó el Thread\n"; // para saber cuando arranca numberToPrint = 0; // empieze a imprimir en 0 // hasta que le digamos que salga while (!terminateThreadFlag) { // imprime el numero y lo incrementa cout << numberToPrint++ << endl; // dormimos un poco para poder ver el thread trabajando Sleep(100); } cout << "Thread Exiting\n"; // para saber cuando terminó } };

Ahora que hemos definido nuestro hilo, lo pondremos a trabajar. Creamos un objeto hilo y le decimos que empiece. Si hacemos esto, el hilo imprimirá para siempre así que es mejor tener alguna forma de evitarlo. Dejaremos al hilo principal (recordemos que es main) esperar a que se presione el teclado, y una vez que se pulsa una tecla, le diremos el hilo que finalice. Si hicimos, todo correctamente el hilo principal debería parase en ese punto hasta que nuestro hilo termine de ejecutar. Luego se le permitirá continuar con el resto del programa. void main() { cout << “Ejemplo de una clase Thread “<<endl; CPrintSomethingThread theThread; // creamos un objeto thread theThread.begin(); // le decimos al thread que empiece cin.get(); // esperamos hasta que se presione una tecla theThread.end(); // entonces le indicamos al thread que pare system("pause"); // y esperamos al usuario que termine el programa }

Como vemos esta clase es simple de usar, y a partir de ella nunca tendremos que escribir CreateThread() de nuevo. Todo lo que tenemos que hacer es heredar un thread con un threadProc nuevo, llamar a begin() y nuestra clase hará todo el trabajo por nosotros. Esta forma de programar es fácil de usar y codifica al programa de forma tal, que otro programador pueda agregar o modificar cosas sin saber lo que está pasando (sobretodo cuando se trabaja en un proyecto con muchas personas). Por supuesto que se le podrían agregar más cosas a la clase para que sea más fácil de usar o más versátil. Recordemos que no hay una sola forma de programar, y los threads no son la excepción. Para probar podríamos hacer que threadProc no tenga un ciclo. Dejemos que la clase mantenga el ciclo, porque ¿que sucede si algún programador se olvidó de verificar el terminateThreadFlag y sale de su ciclo. No habría manera de terminar el hilo. Bueno, si el programador escribe una función que realiza un frame del ciclo del proceso, entonces podría mantener el ciclo oculto para él y comprobar el terminateflag por si mismo ¿no? Otra opción es no tener la threadProc como función virtual que hace que el programador deba derivar una nueva clase para cada subproceso que quiera crear, y pasar un puntero a una función en la función begin(). Si se elige este camino, nunca tendremos derivar un thread nuevo, simplemente asignar el thredProc y se dejarlo ejecutar. Las opciones son infinitas, lo importante es decidir que acceso deseamos que otros programadores tengan sobre el thread, y cómo deseamos que la clase se utilice.