Cool C/C++

Programacion en C/C++

Home Tutoriales Programación C/C++ Ejecutar 2 o más funciones al mismo tiempo
Ejecutar 2 o más funciones al mismo tiempo PDF Imprimir E-mail
Escrito por adrianvaca   
Domingo, 20 de Marzo de 2011 19:08

Lo que queremos hacer es ejecutar 2 o más funciones al mismo tiempo.

Primeramente necesitarás un compilador que soporte la biblioteca windows.h, puede ser el Borland C++ 5.5 o el Dev-C++ 4.9.9.2, luego usaremos hilos (threads), esto permite ejecutar en forma paralela 2 o más funciones al mismo tiempo.

Lo que haremos es crear un hilo por cada función que queramos ejecutar en forma paralela, asociamos cada hilo a la función a ejecutar. Luego iniciamos los 2 hilos con lo cual se ejecutarán las 2 funciones al mismo tiempo, no hace falta esperar a que la una función termine para que la otra empiece (aunque esto se puede controlar). Y luego haremos un truco de forma que la ejecución del programa continue únicamente cuando los 2 hilos terminen. Finalmente cerramos los hilos cuando su ejecución haya concluído.

Ahora empecemos:

Primero la cabecera:

#include <windows.h>


Ahora definimos los prototipos de las 2 funciones que queremos ejecutar al mismo tiempo:

void RunDialogOne();
void RunDialogTwo();


Definimos los 2 controladores, uno por cada hilo:

HANDLE tPrimary, tSecond;


Nuestra función RunDialogOne y RunDialogTwo simplemente mostrarán un mensaje por pantalla, nada más:

void RunDialogOne()
{
   MessageBox(NULL, "Ejecutando: RunDialogOne", "Hilo 1", MB_OK | MB_ICONINFORMATION);
   
   return;
}

void RunDialogTwo()
{
   // WaitForSingleObject(tPrimary, INFINITE);
   MessageBox(NULL, "Ejecutando: RunDialogTwo", "Hilo 2", MB_OK | MB_ICONINFORMATION);
   
   return;
}


Lo importante aquí es la instrucción return, la cual va al final de la función, mediante esta decimos que ha terminado la ejecución del hilo asociado a la función. Siempre hay que llamarla, si no lo hacemos nuestro programa no sabrá si ha terminado o no la ejecución de la función y por lo tanto se colgará. Fíjense en la línea comentada dentro de la función RunDialogTwo, la cual es:

WaitForSingleObject(tPrimary, INFINITE);


Si la descomentamos lo que haremos es que la función se continuará ejecutando únicamente cuando la función a la cual hace referencia el hilo tPrimary termine.

La función WaitForSingleObject permite realizar esta espera, el primer parámetro es el controlador del hilo y el segundo el tiempo en milisegundos que hay que esperar, si queremos que espere indefinidamente como en este caso hay que escribir INFINITE

Bien, ahora vamos a definir la función main que es la que hará el trabajo:

int main()
{   
   DWORD ThreadID;
   
   tPrimary = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RunDialogOne, NULL, CREATE_SUSPENDED, &ThreadID);      
   
   tSecond = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RunDialogTwo, NULL, CREATE_SUSPENDED, &ThreadID);
   
   ResumeThread(tPrimary);
   ResumeThread(tSecond);
   
   HANDLE ThreadContainer[2];
   ThreadContainer[0] = tPrimary;
   ThreadContainer[1] = tSecond;
   
   DWORD dwSuccess = WaitForMultipleObjects(2, ThreadContainer, TRUE, INFINITE);         
   
   if (dwSuccess == WAIT_FAILED)
       MessageBox(NULL, "Espera a fallado!", "ERROR", MB_OK | MB_ICONERROR);
   else
       MessageBox(NULL, "Exito!", "EXITO", MB_OK | MB_ICONINFORMATION);
      
   CloseHandle(tPrimary);
   CloseHandle(tSecond);
   
   return 0;
}


No he puesto comentarios para simplificar el código, pero vamos a explicarlo un poco:

  • Declaramos la variable ThreadID de tipo DWORD, la cual contendrá el identificador del hilo, auqnue realmente no la usaremos en el presente ejemplo, es necesario declararla.


  • Luego creamos un hilo por cada función mediante el método CreateThread, los parámetros en el orden dado son los siguientes:

    NULLAtributos de seguridad. (NULL -> Default)
    0Tamaño de la pila. (0 -> Default)
    (LPTHREAD_START_ROUTINE)RunDialogOnePuntero a la funcion. (TypeCasted).
    NULLParametro de la funcion (si es necesario).
    CREATE_SUSPENDEDNo iniciar hilo todavia
    &ThreadIDID unico para el hilo. No usado en el ejemplo.


  • Luego iniciamos cada hilo mediante la función ResumeThread


  • Ahora, mediante la función WaitForMultipleObjects le decimos al programa que espere a que los 2 hilos especificados en el arreglo ThreadContainer terminen y luego si poder continuar con la ejecución, los parámetros en el orden dado son los siguientes:


    2Numero de hilos en el arreglo.
    ThreadContainerEl arreglo.
    TRUETRUE -> Espera a TODOS los hilos.
    INFINITEEsperar siempre.


  • Luego de terminar la ejecución cerramos los hilos mediante CloseHandle, hay que hacer esto sólo cuando haya terminado la ejecución, si lo hacemos antes, podemos tener problemas

 
Otros artículos

Comentarios  

 
0 #1 Yusniel Cardenas del Valle 10-09-2019 13:49
buen articulo
Citar
 

Escribir un comentario


Código de seguridad
Refescar