• Miércoles 15 de Mayo de 2024, 05:27

Autor Tema:  función _beginthreadex en Linux  (Leído 1546 veces)

bertamax

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
función _beginthreadex en Linux
« en: Domingo 15 de Noviembre de 2009, 10:07 »
0
Hola a todos, estoy buscando sobre esta función porque no sé cómo se utiliza, busco en buscadores de programación de C en Linux no encuentro nada y me han comentado que es igual que en Windows, sólo que cambia las cabeceras, entonces encontré en msdn un tutorial muy bueno que en teoría entiendo esta función pero a la hora de la práctica no se utilizar, o sea que yo tengo una lista de parámetros y cómo lo transformo a un puntero a void, muchas gracias

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: función _beginthreadex en Linux
« Respuesta #1 en: Lunes 16 de Noviembre de 2009, 19:55 »
0
Buenas:

Cita de: "bertamax"
busco en buscadores de programación de C en Linux no encuentro nada y me han comentado que es igual que en Windows,
no te vendria mejor usar fork()? , de esta encontraras miles de tutoriales

Cita de: "bertamax"
entiendo esta función pero a la hora de la práctica no se utilizar

bueno, _beginthread recibe como primer parametro un puntero a una funcion void (void*). O sea, primero preparas una funcion que devuelva void y que reciba un puntero void como parametro , en la que este el cuerpo del proceso paralelo que vayas a usar. Despues, le pasas el nombre de la funcion como primer parametro de _beginthread. Como segundo parametro pasale un 0. Como tercer parametro, pasale un puntero a void del dato que quieres que reciba el proceso como dato.

Que es eso de un puntero a void? normalmente, los punteros son de un tipo de dato, sin embargo, cualquier direccion de memoria puede representarse como un puntero void* que indica una direccion de memoria sin saber que hay en ella.  Mirate en google Casting.

Si quieres pasarle multiples datos, o bien te los preparas en una estructura de datos y le pasas el puntero (vectores, arrays, mapas...) o bien te preparas una estructura y le calzas los datos, si son fijos. Al convertirla en un puntero void* no puedes usar de nuevo la estructura a no ser que la recastees en el tipo original.

ejemplo, un temporizador para pobres:
Código: C++
  1.  
  2.  
  3. //una estructura para guardar los multiples datos
  4. typedef struct TIPO_DATO
  5. {
  6. int hora;
  7. int minutos;
  8. int segundos;
  9. };
  10.  
  11. //una funcion void(void*) que contiene el cuerpo del proceso y que termina con _endthread();
  12. void hilo(void * datos)
  13. {
  14. TIPO_DATO * in=(TIPO_DATO*)datos;
  15.  
  16. int tot=in.horas*3600 + in.minutos*60 + in.segundos;
  17.  
  18. Sleep(tot*1000);
  19.  
  20. MessageBox(0,"TIME UP!",0,0);
  21.  
  22. _endthread();
  23. }
  24.  
  25.  
  26. //bucle principal en el que se lanza el hilo y luego se paraliza en un bucle.
  27. void main(void)
  28. {
  29. TIPO_DATO dat;
  30.  
  31. dat.horas=0;
  32. dat.minutos=1;
  33. dat.segundos=30;
  34.  
  35.  
  36. _beginthread(hilo,0,&dat);
  37.  
  38. while(true)
  39. {
  40. Sleep(1);  //fjate en esto!
  41. }
  42.  
  43. }
  44.  
  45.  
  46.  

en el bucle he colocado un Sleep, por que si no le dejas descansar al hilo para hacer los cambios de contexto, el programa subira al 99% de CPU.


espero que te  haya ayudado!  :good:

bertamax

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: función _beginthreadex en Linux
« Respuesta #2 en: Martes 17 de Noviembre de 2009, 02:44 »
0
Muchas gracias, ya lo entiendo y lo he implementado.