La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Desarrollador Profesional de Juegos Programación III Unidad II Introdución a threading en windows.

Presentaciones similares


Presentación del tema: "Desarrollador Profesional de Juegos Programación III Unidad II Introdución a threading en windows."— Transcripción de la presentación:

1 Desarrollador Profesional de Juegos Programación III Unidad II Introdución a threading en windows

2 Introducion a threading en windows Temas ¿Que es una thread? CreateThread() WaitForSingleObject()

3 Threads En este ejemplo se crearan 2 threads; y solamente imprimirá un mensaje cuando los thread se ejecuten. Vamos a considerar a la función main() como un thread. Además se lo considerará como "main thread“ el thread principal. Es el thread que arranca cuando corremos nuestro programa. Entonces podemos decir que nuestro programa siempre crea un thread por default. Incluimos la libraría windows.h porque es necesario para todas las rutinas de threading. #include using namespace std; void main() { cout << "Introduccion a Windows Threading"<<endl; HANDLE threadHandle; threadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) threadProc, NULL, 0, NULL); WaitForSingleObject( threadHandle, INFINITE); system("pause"); }

4 ¿Como crear un thread? Hay algunas funciones de windows que sirven para esta tarea. Usaremos la función CreateThread(). La descripción completa está en http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createthread.asp. Vemos que tiene 3 argumentos. Por ahora solo nos importará el tercer argumento.. En efecto cuando llamemos a la función, los otros parámetros serán 0, o NULL. El tercer parámetro es el que en la definición se conoce como ThreadProc o "thread procedure". Como el nombre lo indica, este es el procedimiento (o función) que se ejecutará cuando se cree el trhead. Este procedimiento es simplemente una función que escribiremos en nuestro programa. Entonces ¿significa que cuando creamos un thread le estamos diciendo al programa que ejecute una función? CLARO! Crear un thread es esencialmente lo mismo que llamar a una función la diferencia es que le estamos diciendo a esta, que lo haga al mismo tiempo que otras funciones. Entonces antes de comenzar un thread, tenemos que tener una función a ejecutar. Se llamará threadProc. la función que el thread ejecutará es : void threadProc() { cout << "Soy un thread ejecutandose!! “<<endl; }

5 Ahora que tenemos el thread procedure usaremos CreateThread para crear el thread. // El main thread void main() { cout << "Introduccion a Windows Threading"<<endl; // Creamos nuestro thread y ejecutamos la función threadProc. HANDLE threadHandle; threadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) threadProc, NULL, 0, NULL); CreateThread devuelve un HANDLE. Este handle es nada más que un identificador para que la computadora referencie a el thread. Lo usaremos más adelante. ¡Entonces creamos nuestro primer thread! continúa

6 Hay otra función que veremos y es WaitForSingleObject(), es muy útil ya que espera a un objeto que termine lo que está haciendo antes de continuar ejecutando. La definición es: WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds); hHandle - el handle del objeto al que queremos esperar (en este caso será nuestro threadHandle) dwMilliseconds - el máximo numero de milisegundos que esperaremos al objeto terminar antes que continué con la ejecución. (en este ejemplo esperara para siempre) En otras palabras WaitForSingleObject detendrá main thread hasta que threadProc vuelva. Va a esperar hasta que nuestro hilo de ejecución se lleva a cabo luego continua. WaitForSingleObject(threadHandle, INFINITE); // Una vez que nuestro thread terminó decirme cuando terminar. system("pause"); } Threads

7 Y terminamos. Hemos creado un hilo desde nuestro hilo principal, luego esperó al hilo hasta el final de su ejecución y termino el programa. ¿Por qué molestamos por llamar a WaitForSingleObject? Parece que, si hemos comenzado nuestro hilo, sólo se ejecutará independientemente de si tenemos o no que esperar a que termine nuestro hilo principal. Esto es cierto. Sin embargo, cuando se ejecuta este programa, se nota una ligera pausa antes de ver la impresión del mensaje de threadProc. Esto se debe a le lleva un poco de tiempo a nuestro equipo crear el hilo y comenzar a ejecutarlo. No hay manera de saber cuánto tiempo podría llevarle para crear el thread. Podría ser casi de inmediato, si no estamos asignando una gran cantidad de datos y nuestro equipo no está muy ocupado. Pero también podría tomar algunos segundos si estamos ejecutando otras tareas intensas. Si tuviéramos que dejar que nuestro programa principal iniciar el nuevo hilo y luego inmediatamente termine, nunca llegaría a ver el mensaje de salida Y esto se debe a que nuestro hilo principal salio antes de la theadProc incluso antes de empezar!

8 Para probar modifiquemos el código comentado la instrucción WaitForSingleObject (). #include using namespace std; void main() { cout << "Introduccion a Windows Threading"<<endl; HANDLE threadHandle; threadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) threadProc, NULL, 0, NULL); //WaitForSingleObject( threadHandle, INFINITE); system("pause"); } ¿Qué sucede? ¿El mensaje del hilo aparecen después del mensaje "presione cualquier tecla para continuar"? Lo más probable es que si. Esto se debe a la computadora puede ejecutar el código del hilo principal mucho más rápido que el hilo que se crea.. Aquí WaitForSingleObject lo vemos como una introducción. En la próxima unidad veremos un ejemplo más práctico.

9 Resumen Hemos aprendido lo que es un hilo, y para que es útil. Hemos aprendido a crear un hilo siguiendo un procedimiento que hemos creado nosotros mismos. Y hemos aprendido cómo hacer referencia a un hilo con el handle que recibimos cuando se creó el mismo. En la siguiente unidad, aprenderemos sobre mutex y por qué debemos usarlo para proteger ciertos datos de una posible corrupción.


Descargar ppt "Desarrollador Profesional de Juegos Programación III Unidad II Introdución a threading en windows."

Presentaciones similares


Anuncios Google