[C con Clase] Ayuda con threads

Carlos tlx_es_nt en hotmail.com
Jue Mayo 10 17:38:36 CEST 2007


El pasado 2007-05-01 22:12:26, Steven Davidson escribió:
 
SD> Hola Carlos,
SD> El pasado 2007-04-29 13:24:10, Carlos Rodriguez escribió:
SD> CR> Hola, bueno estoy haciendo un programilla con c++ y me han dicho que necesito aprender sobre threads porque al hacer un bucle mi programa se queda bloqueado, entonces me gustaria aprender sobre esto, he estado mirando en MSDN y google, pero entre que viene en ingles, y que no entiendo casi nada... es complicado para mi.
SD> CR> Entonces yo quiero saber como puedo iniciar un thread, como hacer que un codigo se ejecute cada tantos segundos (por ejemplo cada 1 segundo) y sobre todo, muy importante, donde he de poner cada parte del codigo... explicado asi por encima :]
SD> CR>  
SD> Veamos. Un hilo (thread, en inglés) es un "mini-programa" que se ejecuta por su cuenta. Para crear un hilo, usamos 'CreateThread()', donde pasamos una función que tú mismo crearás al igual que un parámetro para tal función. Por ejemplo,
SD> struct info
SD> {
SD>   int entrada;
SD>   int resultado;
SD> };
SD> DWORD WINAPI HacerAlgo( LPVOID pParam )
SD> {
SD>   info *pInfo = (info *) pParam;
SD>   // Hacer lo que tengas que hacer
SD>   ...
SD>   return 0L;  // por ejemplo
SD> }
SD> ...
SD> HANDLE hHilo;
SD> DWORD dwID;
SD> info *pInfo;
SD> ...
SD> pInfo = new info;
SD> pInfo->entrada = 100;
SD> pInfo->salida = 0;
SD> hHilo = CreateThread( NULL, 0, HacerAlgo, pInfo, &dwID );
SD> ...
SD> Cuando se haya terminado el hilo, debemos cerrar el manipulador con 'CloseHandle()'.
SD> Una posibilidad es crear el hilo según la acción del usuario; por ejemplo, al pulsar un botón, o algo parecido. Como no podemos estar completamente seguros de cuándo se termine un hilo, a más tardar cerraremos todos los hilos al cerrarse la aplicación principal al procesar el mensaje 'WM_DESTROY'.
SD> Para ejecutar un código periódicamente, sugiero usar temporizadores. Esto se hace con 'SetTimer()' para crear cualquier temporizador y 'KillTimer()' para desactivarlo. Tenemos dos opciones:
SD> 1. Procesar el mensaje WM_TIMER. Por ejemplo,
SD> case WM_CREATE:
SD>   SetTimer( hwnd, 1, 10000, NULL );  // Temporizador #1 cada 10 segundos
SD>   SetTimer( hwnd, 64, 100, NULL );   // Temporizador #64 cada 100 milisegundos
SD> return 0;
SD> case WM_TIMER:
SD>   if( 1 == wParam )
SD>   {
SD>      // Hacer algo aquí para el temporizador #1
SD>   }
SD>   else if( 64 == wParam )
SD>   {
SD>      // Hacer algo aquí para el temporizador #64
SD>   }
SD> return 0;
SD> 2. Indicar una función propia que se ejecutará periódica y automáticamente. Por ejemplo,
SD> VOID CALLBACK MiFuncion(
SD>   HWND hwnd,         // manipulador a la ventana
SD>   UINT uMsg,         // mensaje WM_TIMER
SD>   UINT_PTR idEvent,  // identificador el temporizador/reloj/alarma
SD>   DWORD dwTime       // hora actual del sistema = GetTickCount()
SD> )
SD> {
SD>   // Hacemos algo
SD>   ...
SD> }
SD> case WM_CREATE:
SD>   // Cada 50 segundos invocamos 'MiFuncion()'
SD>   SetTimer( NULL, 32, 50000, MiFuncion );
SD>   ...
SD> Sin saber exactamente lo que quieres hacer, no te puedo dar una solución concreta a tu problema.
SD> Espero que esto te oriente.
SD> Steven
SD> _______________________________________________
SD> Lista de correo Cconclase Cconclase en listas.conclase.net
SD> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SD> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

Hola mira me gustaria saber si puedo contactar contigo via messenger, necesito ayuda y se me hace dificil hablar via email :S


Más información sobre la lista de distribución Cconclase